Получение Топ-10 на основе значения столбца

У меня есть код, который выводит длинный список суммы количества заказов на работу по имени и сортирует его по общему количеству, имени и количеству:

;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 каждому уникальному имени, с которым сталкивается.

четко разместите свои входные данные и ожидаемый результат

DarkRob 15.07.2019 14:10

Ожидаемый результат приведен в таблице выше. Входные данные такие же, как в таблице выше, только длиннее.

kamaelxiii 15.07.2019 14:16

проверьте мой отредактированный ответ.

DarkRob 15.07.2019 14:27
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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

kamaelxiii 15.07.2019 17:21

это rankname для вашего фильтра, надеюсь, имя ранга будет добавлено как 1,2,3..., как вы хотели.

DarkRob 16.07.2019 05:47

к сожалению, он не сделал этого, как ожидалось. он добавил 1 как rankname для каждой записи.

kamaelxiii 16.07.2019 10:37

на самом деле вам не нужно patition by. Думаю order by будет достаточно. Смотрите мой обновленный ответ.

DarkRob 16.07.2019 12:52

это изменилось, но rankname отображается так: 1 | PLB2 | PLB3 | PLB3 | PLB4 | PLB

kamaelxiii 16.07.2019 13:04

Другие вопросы по теме