Имея таблицу с 3 столбцами:
ID category flag
1 A 1
2 A 0
3 A 0
4 B 0
5 C 0
Я хочу выбрать все строки, которые имеют flag = 1
хотя бы один раз для каждой категории.
Ожидаемые результаты:
ID category flag
1 A 1
2 A 0
3 A 0
Это может быть решено с использованием временной таблицы следующим образом:
select ID into #tempTable from someTable where flag = 1
select * from someTable join #tempTable on someTable.ID = #tempTable.ID
Но я бы предпочел решение с группировкой, которое я изо всех сил стараюсь придумать. Любая помощь будет оценена.
sql-server
group-by
Петр Фальковский
источник
источник
IN
запросе. Но у OP есть « Я хочу выбрать все строки, которые имеют флаг = 1, по крайней мере, один раз на категорию », что заставляет меня думать, чтоDISTINCT
это необходимо в других запросах.CROSS APPLY
,SELECT DISTINCT category
вероятно, должно быть более эффективным, если заменить наSELECT TOP (1) whatever
. Это был бы еще один способ написатьEXISTS
подзапрос.Если предположить , что
Flag
этоBIT
столбец илиINT
который принимает только0
и в1
качестве значений, это может быть достигнуто с использованием оконных функций , а также. Например:Это вывод:
Это найдет наивысшую оценку
Flag
для каждой категории в вашей таблице, в вашем случае это, вероятно, только true / false и выберите только одну из нихtrue(1)
.Преобразование в
TINYINT
необходимо, потомуMAX
что не принимаетBIT
аргумент.источник