2014-10-02 55 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; 
相關問題