2014-10-02 62 views
6

我必须从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而没有得到null0值?
  • 如果projectID = 2有不同的插入日期,并且较早的日期有TAG_VALUEnull元素。但是,我想要tagValue| 1234 Equity 19-SEPT-13 2 |,因为它是最新的价值?

如何,我可以基本忽略所有null0值的值,只需要数字,这是大于0值与最早的日期?

我真的很感谢你的回答!

+0

您能否正确地处理您的查询: FROM project p FROM updated u – Rusty 2014-10-09 09:12:53

+1

TAG_VALUE是VARCHAR2还是NUMBER?这看起来像一个EAV模型,如果你使用的是通用数据类型,答案会更加复杂。 – 2014-10-09 22:45:25

+0

@JonHeller TAG_Value是NUMERIC。 EAV模型意味着什么? – mrquad 2014-10-10 09:06:55

回答

3

考虑到您的分组中PROJECT_ID发生了INSERTION_DATE DESC和积极的TAG_VALUE,我调整了分析功能实现的结果。这可能不是一个可靠的解决方案,但肯定会对你有所帮助。

数据设置:

CREATE TABLE Table1 
    ("TAG_VALUE" varchar2(5), "TAG_DESC" varchar2(6), "INSERTION_DATE" varchar2(10), "PROJECT_ID" int) 
; 

INSERT ALL 
    INTO Table1 ("TAG_VALUE", "TAG_DESC", "INSERTION_DATE", "PROJECT_ID") 
     VALUES (NULL, 'Equity', '14-DEC-14', 1) 
    INTO Table1 ("TAG_VALUE", "TAG_DESC", "INSERTION_DATE", "PROJECT_ID") 
     VALUES ('0', 'Equity', '14-DEC-14', 1) 
    INTO Table1 ("TAG_VALUE", "TAG_DESC", "INSERTION_DATE", "PROJECT_ID") 
     VALUES ('312', 'Equity', '14-DEC-14', 1) 
    INTO Table1 ("TAG_VALUE", "TAG_DESC", "INSERTION_DATE", "PROJECT_ID") 
     VALUES ('23343', 'Equity', '17-DEC-11', 5) 
    INTO Table1 ("TAG_VALUE", "TAG_DESC", "INSERTION_DATE", "PROJECT_ID") 
     VALUES ('1263', 'Equity', '16-DEC-11', 5) 
    INTO Table1 ("TAG_VALUE", "TAG_DESC", "INSERTION_DATE", "PROJECT_ID") 
     VALUES (NULL, 'Equity', '22-JÄN-14', 2) 
    INTO Table1 ("TAG_VALUE", "TAG_DESC", "INSERTION_DATE", "PROJECT_ID") 
     VALUES (NULL, 'Equity', '11-JÄN-14', 2) 
    INTO Table1 ("TAG_VALUE", "TAG_DESC", "INSERTION_DATE", "PROJECT_ID") 
     VALUES (NULL, 'Equity', '25-SEPT-13', 2) 
    INTO Table1 ("TAG_VALUE", "TAG_DESC", "INSERTION_DATE", "PROJECT_ID") 
     VALUES ('0', 'Equity', '20-SEPT-13', 2) 
    INTO Table1 ("TAG_VALUE", "TAG_DESC", "INSERTION_DATE", "PROJECT_ID") 
     VALUES ('1234', 'Equity', '19-SEPT-13', 2) 
    INTO Table1 ("TAG_VALUE", "TAG_DESC", "INSERTION_DATE", "PROJECT_ID") 
     VALUES ('13415', 'Equity', '18-SEPT-13', 2) 
    INTO Table1 ("TAG_VALUE", "TAG_DESC", "INSERTION_DATE", "PROJECT_ID") 
     VALUES ('99999', 'Equity', '16-OCT-10', 9) 
SELECT * FROM dual 
; 

查询:

SELECT tag_value, 
     tag_desc, 
     insertion_date, 
     project_id 
FROM (SELECT tag_value, 
       tag_desc, 
       insertion_date, 
       project_id, 
       Last_value(Decode(tag_value, 0, NULL, 
              tag_value) ignore nulls) 
       over ( 
        PARTITION BY project_id 
        ORDER BY insertion_date ROWS BETWEEN unbounded preceding AND 
       unbounded 
       following) new_tag_value 
     FROM table1) 
WHERE tag_value = new_tag_value; 

结果:

TAG_VALUE TAG_DESC INSERTION_DATE PROJECT_ID 
312   Equity  14-DEC-14  1 
1234  Equity  19-SEPT-13  2 
23343  Equity  17-DEC-11  5 
99999  Equity  16-OCT-10  9 

这里是fiddle

1

您可以从表格的内部查询中选择min(Insertion_Date)和项目ID,并通过Tag_Value <> Null对其进行过滤。然后你在外部查询中,内部将这个内部查询连接到project_id和insertion_date上。

+0

您能否通过示例查询添加示例?在表格的内部查询中选择min(Insertion_Date)和项目ID,并通过Tag_Value <> Null从中筛选出来,具体意味着什么? – mrquad 2014-10-02 19:59:35

+0

从表 中选择* 加入 (选择PROJECT_ID,min( INSERTION_DATE) 从表 其中Tag_Value <>空 组由项目ID) – Xion 2014-10-03 13:46:00

+0

选择* 从表t1 加入 (选择PROJECT_ID,分钟(INSERTION_DATE) 从表 其中Tag_Value <>空 组由项目ID)上t1.Project_id = t2.project_id 和t1.insertion_date = t2.insertion_dateT2 “表”在这里可以是你实际的表或你在问题中提到的select语句。 – Xion 2014-10-03 13:53:53

1

使用案例1:

如果我理解正确的使用情况,您可以按如下通过您的分析函数的排序子句在非空非零tag_value -s的“优先级”做:

ROW_NUMBER() OVER (
    PARTITION BY p.proj_id 
    ORDER BY 
     CASE WHEN t.tag_value > 0 THEN 0 ELSE 1 END ASC, 
     u.update_as_of DESC 
) RN 

这当然会给你在你的输出null -s或零每次没有其他tag_value -s在你的数据分区由p.proj_id标识。


使用案例2:

如果你想摆脱零和null -s完全,你必须修改你的(内部)查询where条款改为:

WHERE t.tag_desc LIKE 'Equity%' 
    AND t.tag_value > 0 
3

你的问题是:“如何,可我基本上忽略所有空,也为0值的值”

简单的答案是:通过删除WHERE子句中的那些记录。

我用AND t.tag_value > 0这里。如果您想允许负值,您可以用AND t.tag_value <> 0 AND t.tag_value IS NOT NULL替换它。

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 updated u 
    JOIN project p ON p.project_id = u.project_id 
    JOIN tag t ON t.tag_id = u.tag_id 
    WHERE t.tag_desc LIKE 'Equity%' AND t.tag_value > 0 
) 
WHERE RN = 1; 
相关问题