Pio*_*ski 10 sql-server group-by
有 3 列的表:
ID category flag
1 A 1
2 A 0
3 A 0
4 B 0
5 C 0
Run Code Online (Sandbox Code Playgroud)
我想选择flag = 1
每个类别至少有一次的所有行。
预期成绩:
ID category flag
1 A 1
2 A 0
3 A 0
Run Code Online (Sandbox Code Playgroud)
可以使用这样的临时表来解决:
select ID into #tempTable from someTable where flag = 1
select * from someTable join #tempTable on someTable.ID = #tempTable.ID
Run Code Online (Sandbox Code Playgroud)
但我更喜欢分组的解决方案,我很难想出。任何帮助将不胜感激。
Jul*_*eur 16
GROUP BY
不能单独使用,因为它每组只返回 1 行 ( category
)。
您可以将子查询与flag = 1
和一起使用INNER JOIN
:
SELECT d1.ID, d1.category, d1.flag
FROM data d1
INNER JOIN (
SELECT DISTINCT category FROM data WHERE flag = 1
) d2
ON d2.category = d1.category ;
Run Code Online (Sandbox Code Playgroud)您可以使用以下EXISTS
条款:
SELECT d.ID, d.category, d.flag
FROM data d
WHERE EXISTS (
SELECT 1 FROM data WHERE flag = 1 AND category = d.category
) ;
Run Code Online (Sandbox Code Playgroud)您可以使用IN
子句(虽然EXISTS
更好):
SELECT d.ID, d.category, d.flag
FROM data d
WHERE d.category IN (SELECT category FROM data WHERE flag = 1) ;
Run Code Online (Sandbox Code Playgroud)您还可以CROSS APPLY
与子查询一起使用flag = 1
:
SELECT d.ID, d.category, d.flag
FROM data d
CROSS APPLY (
SELECT TOP (1) category
FROM data
WHERE flag = 1 AND category = d.category
) ca ;
Run Code Online (Sandbox Code Playgroud)DISTINCT
如果对于每个类别,只有 1 行可以有flag = 1
.
ID category flag
1 A 1
2 A 0
3 A 0
Run Code Online (Sandbox Code Playgroud)