仅查询最早可能日期的数值

Ann*_*lee 6 sql oracle oracle11g

我必须从oracle 11db 查询.通过下面的查询,我TAG_VALUE, TAG_DESC, INSERTION_DATE and PROJECT_ID从我的数据库中获取最新信息.

SELECT * 
FROM   (SELECT t.tag_value, 
               t.tag_desc, 
               u.update_as_of                    AS INSERTION_DATE, 
               p.proj_id                         AS PROJECT_ID, 
               Row_number() 
                 over( 
                   PARTITION BY p.proj_id 
                   ORDER BY u.update_as_of DESC) RN 
        FROM   project p 
               join update u 
                 ON p.project_id = u.project_id 
               join tag t 
                 ON t.tag_id = u.tag_id 
        WHERE  t.tag_desc LIKE 'Equity%') 
WHERE  rn = 1;
Run Code Online (Sandbox Code Playgroud)

但是,我遇到的情况是,我的请求的答案(没有按日期排序)看起来像这样:

+----------------------------------------------+
| TAG_VALUE TAG_DESC INSERTION_DATE PROJECT_ID |
+----------------------------------------------+
| null        Equity  14-DEC-14       1        |
| 0           Equity  14-DEC-14       1        |
| 312         Equity  14-DEC-14       1        |
| 23343       Equity  17-DEC-11       5        |
| 1263        Equity  16-DEC-11       5        |
| null        Equity  22-JÄN-14       2        |
| null        Equity  11-JÄN-14       2        |
| null        Equity  25-SEPT-13      2        |
| 0           Equity  20-SEPT-13      2        |
| 1234        Equity  19-SEPT-13      2        |
| 13415       Equity  18-SEPT-13      2        |
| 99999       Equity  16-OCT-10       9        |
+----------------------------------------------+
Run Code Online (Sandbox Code Playgroud)

我的Result Set看起来应该是这样的:

+----------------------------------------------+
| TAG_VALUE TAG_DESC INSERTION_DATE PROJECT_ID |
+----------------------------------------------+
| 312         Equity  14-DEC-14       1        |
| 23343       Equity  17-DEC-11       5        |
| 1234        Equity  19-SEPT-13      2        |
| 99999       Equity  16-OCT-10       9        |
+----------------------------------------------+
Run Code Online (Sandbox Code Playgroud)

有两种情况,主要关注同一问题:

  • 如您所见,有两种情况,project_id = 1即插入日期始终相同.但是,根据我上面的查询,我仍然会null因为这个而回来ordering.如何在312没有获得null0价值的情况下获得号码?
  • 如果projectID = 2有不同的插入日期,并且较早的日期具有TAG_VALUE null元素.不过,我想拥有tagValue| 1234 Equity 19-SEPT-13 2 |,因为它是最新的价值?

怎么样,可我基本上无视一切null,也0值的值,只需要数字,它大于0与最早的日期值?

我非常感谢你的回答!

Sri*_*niV 3

考虑到您的分组发生在 INSERTION_DATE DESC 的 PROJECT_ID 和正 TAG_VALUE 内,我调整了分析函数以实现结果。这可能不是一个强大的解决方案,但肯定会对您有所帮助。

\n\n

数据设置:

\n\n
CREATE TABLE Table1\n    ("TAG_VALUE" varchar2(5), "TAG_DESC" varchar2(6), "INSERTION_DATE" varchar2(10), "PROJECT_ID" int)\n;\n\nINSERT ALL \n    INTO Table1 ("TAG_VALUE", "TAG_DESC", "INSERTION_DATE", "PROJECT_ID")\n         VALUES (NULL, \'Equity\', \'14-DEC-14\', 1)\n    INTO Table1 ("TAG_VALUE", "TAG_DESC", "INSERTION_DATE", "PROJECT_ID")\n         VALUES (\'0\', \'Equity\', \'14-DEC-14\', 1)\n    INTO Table1 ("TAG_VALUE", "TAG_DESC", "INSERTION_DATE", "PROJECT_ID")\n         VALUES (\'312\', \'Equity\', \'14-DEC-14\', 1)\n    INTO Table1 ("TAG_VALUE", "TAG_DESC", "INSERTION_DATE", "PROJECT_ID")\n         VALUES (\'23343\', \'Equity\', \'17-DEC-11\', 5)\n    INTO Table1 ("TAG_VALUE", "TAG_DESC", "INSERTION_DATE", "PROJECT_ID")\n         VALUES (\'1263\', \'Equity\', \'16-DEC-11\', 5)\n    INTO Table1 ("TAG_VALUE", "TAG_DESC", "INSERTION_DATE", "PROJECT_ID")\n         VALUES (NULL, \'Equity\', \'22-J\xc3\x84N-14\', 2)\n    INTO Table1 ("TAG_VALUE", "TAG_DESC", "INSERTION_DATE", "PROJECT_ID")\n         VALUES (NULL, \'Equity\', \'11-J\xc3\x84N-14\', 2)\n    INTO Table1 ("TAG_VALUE", "TAG_DESC", "INSERTION_DATE", "PROJECT_ID")\n         VALUES (NULL, \'Equity\', \'25-SEPT-13\', 2)\n    INTO Table1 ("TAG_VALUE", "TAG_DESC", "INSERTION_DATE", "PROJECT_ID")\n         VALUES (\'0\', \'Equity\', \'20-SEPT-13\', 2)\n    INTO Table1 ("TAG_VALUE", "TAG_DESC", "INSERTION_DATE", "PROJECT_ID")\n         VALUES (\'1234\', \'Equity\', \'19-SEPT-13\', 2)\n    INTO Table1 ("TAG_VALUE", "TAG_DESC", "INSERTION_DATE", "PROJECT_ID")\n         VALUES (\'13415\', \'Equity\', \'18-SEPT-13\', 2)\n    INTO Table1 ("TAG_VALUE", "TAG_DESC", "INSERTION_DATE", "PROJECT_ID")\n         VALUES (\'99999\', \'Equity\', \'16-OCT-10\', 9)\nSELECT * FROM dual\n;\n
Run Code Online (Sandbox Code Playgroud)\n\n

询问:

\n\n
SELECT tag_value, \n       tag_desc, \n       insertion_date, \n       project_id \nFROM   (SELECT tag_value, \n               tag_desc, \n               insertion_date, \n               project_id, \n               Last_value(Decode(tag_value, 0, NULL, \n                                            tag_value) ignore nulls) \n                 over ( \n                   PARTITION BY project_id \n                   ORDER BY insertion_date ROWS BETWEEN unbounded preceding AND \n                 unbounded \n                 following ) new_tag_value \n        FROM   table1) \nWHERE  tag_value = new_tag_value; \n
Run Code Online (Sandbox Code Playgroud)\n\n

结果:

\n\n
TAG_VALUE   TAG_DESC    INSERTION_DATE  PROJECT_ID\n312         Equity      14-DEC-14       1\n1234        Equity      19-SEPT-13      2\n23343       Equity      17-DEC-11       5\n99999       Equity      16-OCT-10       9\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是小提琴

\n