У меня есть код, который выводит длинный список суммы количества заказов на работу по имени и сортирует его по общему количеству, имени и количеству:
;with cte as (
SELECT [Name],
[Emergency],
count([Emergency]) as [CountItem]
FROM tableA
GROUP BY [Name], [Emergency])
select Name,[Emergency],[Count],SUM([CountItem]) OVER(PARTITION BY Name) as Total from cte
order by Total desc, Name, [CountItem] desc
но я хочу получить только 10 лучших имен с наибольшей суммой, как показано ниже:
+-------+-------------------------------+-------+-------+
| Name | Emergency | Count | Total |
+-------+-------------------------------+-------+-------+
| PLB | No | 7 | 15 |
| PLB | No Hot Water | 4 | 15 |
| PLB | Resident Locked Out | 2 | 15 |
| PLB | Overflowing Tub | 1 | 15 |
| PLB | No Heat | 1 | 15 |
| GG | Broken Lock - Exterior | 6 | 6 |
| BOA | Broken Lock - Exterior | 2 | 4 |
| BOA | Garage Door not working | 1 | 4 |
| BOA | Resident Locked Out | 1 | 4 |
| 15777 | Smoke Alarm not working | 3 | 3 |
| FP | No air conditioning | 2 | 3 |
| FP | Flood | 1 | 3 |
| KB | No electrical power | 2 | 3 |
| KB | No | 1 | 3 |
| MEM | Noise Complaint | 3 | 3 |
| ANG | Parking Issue | 2 | 2 |
| ALL | Smoke Alarm not working | 2 | 2 |
| AAS | No air conditioning | 1 | 2 |
| AAS | Toilet - Clogged (1 Bathroom) | 1 | 2 |
+-------+-------------------------------+-------+-------+
Примечание. Мне не нужны уникальные значения. Как видно из приведенного выше примера, он получает 10 лучших имен из очень длинной таблицы.
То, что я хочу сделать, это назначить идентификатор строки для каждого имени, чтобы все PLB выше имели идентификатор строки 1, GG = 2, BOA = 3,...
Поэтому при окончательном выборе я добавлю только предложение where where row id <= 10. Я уже пробовал ROW_NUMBER() OVER(PARTITION BY Name ORDER BY Name), но он присваивает 1 каждому уникальному имени, с которым сталкивается.
Ожидаемый результат приведен в таблице выше. Входные данные такие же, как в таблице выше, только длиннее.
проверьте мой отредактированный ответ.





Вы можете попробовать это:
;with cte as (
SELECT [Name],
[Emergency],
count([Emergency]) as [CountItem]
FROM tableA
GROUP BY [Name], [Emergency]),
ct as (
select Name,[Emergency],[Count],SUM([CountItem]) OVER(PARTITION BY PropertyName) as Total from cte
),
ctname as (
select dense_rank() over ( order by total, name ) as RankName, Name,[Emergency],[Count], total from ct )
select * from ctname where rankname < 11
Я попробовал ваш ответ, но он дал мне весь исходный список, он просто добавил новый столбец rankname
это rankname для вашего фильтра, надеюсь, имя ранга будет добавлено как 1,2,3..., как вы хотели.
к сожалению, он не сделал этого, как ожидалось. он добавил 1 как rankname для каждой записи.
на самом деле вам не нужно patition by. Думаю order by будет достаточно. Смотрите мой обновленный ответ.
это изменилось, но rankname отображается так: 1 | PLB2 | PLB3 | PLB3 | PLB4 | PLB
четко разместите свои входные данные и ожидаемый результат