假设我有一个表(关系),如
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
只能标记一个。我想为所有实体1
获取标记为ID1
的数据。如果没有标记记录,请获取第一个或其中任何一个。
对于上述样本数据,结果应为:
1, 1, 1, ...
2, 34, 1, ...
3, 4, 0, ...
4, 546, 0, ...
Union可能是一个解决方案,但是太长并且可能性能不佳。
我的想法是按ID1
和IsMarked
desc对数据进行排序,得到每个ID1
的前1个,但是如何为这种情况编写SQL
?
答案 0 :(得分:3)
对于每个ID1 只能标记一个,以下内容应该有效:
;with cte as (
select *, rn=row_number() over (partition by ID1 order by IsMarked desc)
)
select *
from cte
where rn=1
答案 1 :(得分:0)
在黑暗中拍摄:
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);