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)
| 归档时间: |
|
| 查看次数: |
24165 次 |
| 最近记录: |