【发布时间】:2014-10-02 15:14:33
【问题描述】:
我必须从 oracle 11 数据库查询。
通过下面的查询,我可以从我的数据库中获取所有最近的 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插入日期始终相同时。但是,通过上面的查询,由于ordering,我仍然得到null。如何在不获取null或0值的情况下找回号码312? - 如果
projectID = 2存在不同的插入日期,并且较早的日期具有TAG_VALUEnull元素。但是,我想要| 1234 Equity 19-SEPT-13 2 |的tagValue,因为它是最新值?
如何,我基本上可以忽略所有null 和0 值,只取大于0 值且日期最早的数字吗?
非常感谢您的回答!
【问题讨论】:
-
您能否更正您的查询:FROM project p FROM updated u
-
TAG_VALUE 是 VARCHAR2 还是 NUMBER?这看起来像一个 EAV 模型,如果您使用的是通用数据类型,答案会复杂得多。
-
@JonHeller TAG_Value 是 NUMERIC。 EAV 模型是什么意思?
-
实体-属性-值。这是数据库中常见的反模式,通常会导致将所有值存储为字符串。幸好你没有上当!我之前看到过 EAV 模型使用那些完全相同的列名,这就是我问的原因。