我必须从oracle 11
db查询。 使用下面的查询,我从我的数据库中获得所有最近的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;
不过,我来到了防空火炮的情况下,我的要求(不按日期排序的话)的回答可以看起来像:
+----------------------------------------------+
| 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 |
+----------------------------------------------+
我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 |
+----------------------------------------------+
有两种情况,基本上都集中在同一个问题上:
- 正如你所看到的,有两种情况,当插入日期总是相同时
project_id = 1
。但是,通过我的查询,我仍然得到null
,因为ordering
。我怎样才能得到312
而没有得到null
或0
值? - 如果
projectID = 2
有不同的插入日期,并且较早的日期有TAG_VALUE
null
元素。但是,我想要tagValue
的| 1234 Equity 19-SEPT-13 2 |
,因为它是最新的价值?
如何,我可以基本忽略所有null
也0
值的值,只需要数字,这是大于0
值与最早的日期?
我真的很感谢你的回答!
您能否正确地处理您的查询: FROM project p FROM updated u – Rusty 2014-10-09 09:12:53
TAG_VALUE是VARCHAR2还是NUMBER?这看起来像一个EAV模型,如果你使用的是通用数据类型,答案会更加复杂。 – 2014-10-09 22:45:25
@JonHeller TAG_Value是NUMERIC。 EAV模型意味着什么? – mrquad 2014-10-10 09:06:55