[英]How to write sql for this case?
假設我有一個表(一個關系)
MyTab(ID1,ID2,IsMarked, data,....)
樣本數據可能看起來像:
1, 1, 1, ...
1, 2, 0, ...
1, 3, 0, ...
2, 34, 1, ...
3, 4, 0, ...
4, 546, 0, ...
4, 8, 0, ...
每個ID1
只能標記一個。 我想為所有實體ID1
都將數據標記為1
。 如果沒有標記的記錄,則獲取第一個或其中一個。
對於上述樣本數據,結果應為:
1, 1, 1, ...
2, 34, 1, ...
3, 4, 0, ...
4, 546, 0, ...
聯合可能是一個解決方案,但時間太長,可能會導致性能下降。 我的想法是按ID1
和IsMarked
desc對數據進行排序,為每個ID1
獲取第一個1,但是在這種情況下如何編寫SQL
?
對於每個ID1只能標記一個 ,以下各項應起作用:
;with cte as (
select *, rn=row_number() over (partition by ID1 order by IsMarked desc)
)
select *
from cte
where rn=1
在黑暗中拍攝:
SELECT A.*
FROM MYTAB A
LEFT JOIN (
SELECT MAX(ID2) AS MAXID2, ID1
FROM MYTAB
WHERE ISMARKED=1
GROUP BY ID1
) B ON A.ID2=B.MAXID2 AND A.ID1=B.ID1
LEFT JOIN (
SELECT MAX(ID2) AS MAXID2, ID1
FROM MYTAB
WHERE ISMARKED=0
GROUP BY ID1
) C ON A.ID2=C.MAXID2 AND A.ID1=C.ID1
WHERE
(B.ID1 IS NOT NULL)
OR
(B.ID1 IS NULL AND C.ID1 IS NOT NULL);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.