簡體   English   中英

在這種情況下,如何編寫sql?

[英]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, ...

聯合可能是一個解決方案,但時間太長,可能會導致性能下降。 我的想法是按ID1IsMarked 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM