Select 不同的行,其中一列中的所有值都相同 SQL 服务器
Select distinct rows where all values in a column are the same SQL Server
我想找到不同的 FKID,其中 IsProcessed 对于相同的 FKID 为 True。
例如
CID FKID DataField IsProcessed
1 1 Test 1
2 1 Test 1
3 2 Test 0
4 2 Test 1
5 3 Test 0
6 3 Test 0
7 4 Test 1
8 5 Test 0
9 6 Test 1
10 6 Test 1
11 6 Test 1
我想要返回以下 FKIDs 1,4,6
因为这些是 FKID,其中 isprocessed 对于所有实例都是正确的。
如有任何帮助,我们将不胜感激!谢谢!
您可以使用 SUM() OVER
和 COUNT() OVER
;WITH CTE AS(
SELECT
*,
IsProcessedCount = SUM(CASE WHEN IsProcessed = 1 THEN 1 ELSE 0 END) OVER(PARTITION BY FKID),
cc = COUNT(*) OVER(PARTITION BY FKID)
FROM TEST
)
SELECT
DISTINCT FKID
FROM CTE
WHERE IsProcessedCount = cc
使用 GROUP BY
和 HAVING
:
SELECT FKID
FROM Test
GROUP BY FKID
HAVING COUNT(FKID) = COUNT(CASE WHEN IsProcessed = 1 THEN 1 ELSE NULL END)
另一种方式:
SELECT FKID
FROM Test
GROUP BY FKID
HAVING COUNT(FKID) = SUM(CAST(IsProcessed AS INT))
只需将 TEST
替换为您的 table。
SELECT FKID
FROM TableName
GROUP BY FKID
HAVING (MIN(IsProcessed) = 1)
或者
SELECT FKID
FROM TableName
GROUP BY FKID
HAVING (MIN(CAST(IsProcessed AS INT)) = 1)
如果 IsProcessed 不是数字类型:
另一种方式,使用相关的 not exists
谓词:
select fkid from TableName t
where IsProcessed = 1
and not exists
(select 1 from TableName where IsProcessed = 0 and FKID = t.FKID)
group by fkid
或相同的使用not in
:
select fkid from TableName t
where IsProcessed = 1
and fkid not in
(select fkid from TableName where IsProcessed = 0 and FKID = t.FKID)
group by fkid
我想找到不同的 FKID,其中 IsProcessed 对于相同的 FKID 为 True。 例如
CID FKID DataField IsProcessed
1 1 Test 1
2 1 Test 1
3 2 Test 0
4 2 Test 1
5 3 Test 0
6 3 Test 0
7 4 Test 1
8 5 Test 0
9 6 Test 1
10 6 Test 1
11 6 Test 1
我想要返回以下 FKIDs 1,4,6 因为这些是 FKID,其中 isprocessed 对于所有实例都是正确的。
如有任何帮助,我们将不胜感激!谢谢!
您可以使用 SUM() OVER
和 COUNT() OVER
;WITH CTE AS(
SELECT
*,
IsProcessedCount = SUM(CASE WHEN IsProcessed = 1 THEN 1 ELSE 0 END) OVER(PARTITION BY FKID),
cc = COUNT(*) OVER(PARTITION BY FKID)
FROM TEST
)
SELECT
DISTINCT FKID
FROM CTE
WHERE IsProcessedCount = cc
使用 GROUP BY
和 HAVING
:
SELECT FKID
FROM Test
GROUP BY FKID
HAVING COUNT(FKID) = COUNT(CASE WHEN IsProcessed = 1 THEN 1 ELSE NULL END)
另一种方式:
SELECT FKID
FROM Test
GROUP BY FKID
HAVING COUNT(FKID) = SUM(CAST(IsProcessed AS INT))
只需将 TEST
替换为您的 table。
SELECT FKID
FROM TableName
GROUP BY FKID
HAVING (MIN(IsProcessed) = 1)
或者
SELECT FKID
FROM TableName
GROUP BY FKID
HAVING (MIN(CAST(IsProcessed AS INT)) = 1)
如果 IsProcessed 不是数字类型:
另一种方式,使用相关的 not exists
谓词:
select fkid from TableName t
where IsProcessed = 1
and not exists
(select 1 from TableName where IsProcessed = 0 and FKID = t.FKID)
group by fkid
或相同的使用not in
:
select fkid from TableName t
where IsProcessed = 1
and fkid not in
(select fkid from TableName where IsProcessed = 0 and FKID = t.FKID)
group by fkid