2017-05-29 48 views
2

我目前在編寫業務邏輯時遇到問題,無法從表中獲取具有id和我已附加到其中的標誌的行。SQL根據條件獲取行

例如,

id: id seq num: flag: Date: 
A  1    N  .. 
A  2    N  .. 
A  3    N 
A  4    Y 
B  1    N 
B  2    Y 
B  3    N 
C  1    N 
C  2    N 

最終的結果我想實現的是: 對於每一個唯一的ID我只想取回一行與該行作爲條件

如果該標誌是「Y」,則返回該行。

否則返回最後一個「N」行。

另一個要注意的是,「Y」標誌是不必總是最後

我一直試圖讓使用分區case條件像 OVER (PARTITION BY A."ID" ORDER BY A."Seq num")但至今沒有運氣。

- 編輯:

從表中,抽樣結果將是:

id: id seq num: flag: date: 
A   4  Y  .. 
B   2  Y  .. 
C   2  N  .. 
+0

什麼是你嘗試的情況狀況?你有沒有試過把分區的結果放在公用表格表達式中,這樣你就可以使用這種情況了? – Sander

+0

您能向我們展示您對該樣本表的期望輸出嗎?我很難弄清楚「唯一ID」是指什麼。 –

+0

@TimBiegeleisen我已添加結果 – Pyrons

回答

0

SELECT DISTINCT標識,標誌 FROM yourTable

1

我的做法是採取兩者的UNION查詢。第一個查詢只是簡單地選擇所有Yes記錄,假設Yes只出現一次,每ID組。第二個查詢只針對那些沒有Yes任何地方的ID。對於這些記錄,我們使用行號來選擇最近的No記錄。

WITH cte1 AS (
    SELECT id 
    FROM yourTable 
    GROUP BY id 
    HAVING SUM(CASE WHEN flag = 'Y' THEN 1 ELSE 0 END) = 0 
), 
cte2 AS (
    SELECT *, 
      ROW_NUMBER() OVER (PARTITION BY t1.id ORDER BY t1."id seq" DESC) rn 
    FROM yourTable t1 
    INNER JOIN cte1 t2 
     ON t1.id = t2.id 
) 
SELECT * 
FROM yourTable 
WHERE flag = 'Y' 
UNION ALL 
SELECT * 
FROM cte2 t2 
WHERE t2.rn = 1 
3

使用窗口子句是正確的想法。您應該由ID劃分的結果(如你所做的),和秩序裏面,這樣Y標誌行是第一位的,那麼所有的N國旗行以日期降序排列,並挑頭的每個ID:

SELECT id, id_seq_num, flag, date 
FROM (SELECT id, id_seq_num, flag, date, 
       ROW_NUMBER() OVER (PARTITION BY id 
            ORDER BY CASE flag WHEN 'Y' THEN 0 
                ELSE 1 
              END ASC, 
              date ASC) AS rk 
     FROM mytable) t 
WHERE rk = 1 
+1

這看起來不錯,比我自己的查詢更好+1 –

+0

@Mureinik抱歉後期問題,但如果'Y'每個ID出現多次,是否選擇出現的第一個'Y'或按日期排序的最後一個'Y'?如果它確實選擇了最後的'Y',那麼如何修改才能選擇第一個'Y'。謝謝 – Pyrons

+0

@Pyrons我編輯'order by'窗口子句,所以只選擇第一個'Y'。 – Mureinik

1

這裏有一種方法(用相當普通的SQL):

select t1.* 
from Table1 as t1 
where t1.id_seq_num = COALESCE( 
    (select max(id_seq_num) from Table1 as T2 where t1.id = t2.id and t2.flag = 'Y') , 
    (select max(id_seq_num) from Table1 as T3 where t1.id = t3.id and t3.flag = 'N')) 

可在小提琴這裏:http://sqlfiddle.com/#!9/5f7f9/6

+0

嗨@Turophile,如果Table1碰巧是一個長查詢,我不能使用視圖,我怎麼會寫這個? – Pyrons

+0

您正在使用哪個數據庫引擎? – Turophile

+0

現在好了。謝謝您的幫助 – Pyrons