SQL Server Query: Как я могу получить максимальное количество для определенных групп? - PullRequest
0 голосов
/ 18 декабря 2018

У нас есть таблица со следующей информацией:

Идентификатор учетной записи, номер касания, тип, дата касания и этап (ранжирование 1-3, 1, если число касания <50, 2, если 51-100,3, если> 100).

Снимок экрана из таблицы

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

Вывод, который я ожидаю получить

Вот текущий написанный мной запрос, который не работает для меня:

`SELECT distinct
a.[Account ID],
a.Stage,
bb.Stage1TopType,
bb.TypeCount_1,
c.Stage2TopType,
c.TypeCount_2,
d.Stage3TopType,
d.TypeCount_3
FROM SFAX.dbo.LinearTest as a

--STAGE 1
LEFT JOIN 
(
SELECT 
a.[Account ID],
a.Type as Stage1TopType,
Max(b.TouchCount) as TypeCount_1
FROM SFAX.dbo.LinearTest as a

LEFT JOIN 
(
SELECT
[Account ID],
Type,
COUNT(TouchNumber) as TouchCount
FROM SFAX.dbo.LinearTest 
WHERE Stage = 1
GROUP BY [Account ID], Type
) as b on a.[Account ID] = b.[Account ID]

WHERE a.Stage = 1
GROUP BY a.[Account ID], a.Type

) as bb on a.[Account ID] = bb.[Account ID]


--STAGE 2
LEFT JOIN 
(
SELECT 
a.[Account ID],
a.Type as Stage2TopType,
Max(b.TouchCount) as TypeCount_2
FROM SFAX.dbo.LinearTest as a

LEFT JOIN 
(
SELECT
[Account ID],
Type,
COUNT(TouchNumber) as TouchCount
FROM SFAX.dbo.LinearTest 
WHERE Stage = 2
GROUP BY [Account ID], Type
) as b on a.[Account ID] = b.[Account ID]

WHERE a.Stage = 2
GROUP BY a.[Account ID], a.Type

) as c on a.[Account ID] = c.[Account ID]


--STAGE 3
LEFT JOIN 
(
SELECT 
a.[Account ID],
a.Type as Stage3TopType,
Max(b.TouchCount) as TypeCount_3
FROM SFAX.dbo.LinearTest as a

LEFT JOIN 
(
SELECT
[Account ID],
Type,
COUNT(TouchNumber) as TouchCount
FROM SFAX.dbo.LinearTest 
WHERE Stage = 3
GROUP BY [Account ID], Type
) as b on a.[Account ID] = b.[Account ID]

WHERE a.Stage = 3
GROUP BY a.[Account ID], a.Type

) as d on a.[Account ID] = d.[Account ID]

`

Пожалуйста, дайте мне знать, еслиу вас есть какие-либо предложения о том, как я могу получить желаемый результат.

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Что я ищу, так это тип, который появляется наибольшее количество раз на каждом этапе.

Сначала вам нужно будет выполнить подсчет, а затем решить, какой из них имеетсамое высокое значениеНиже вы увидите счет, выполненный в «производной таблице», затем row_number () используется для присвоения значения 1 наибольшему количеству, и, наконец, мы возвращаем только те строки с этим значением 1

SELECT
    [Account ID]
  , Stage
  , TouchNumber
  , Type
  , TouchDate
  , type_count
FROM (
    SELECT
        [Account ID]
      , Stage
      , TouchNumber
      , Type
      , TouchDate
      , type_count
      , ROW_NUMBER() OVER (PARTITION BY [Account ID], Stage ORDER BY type_count DESC, Type) AS rn
    FROM (
        SELECT
            [Account ID]
          , Stage
          , TouchNumber
          , Type
          , TouchDate
          , COUNT( * ) OVER (PARTITION BY [Account ID], Stage, Type) AS type_count
        FROM YourTable AS T
    ) sq
) d
WHERE rn = 1
ORDER BY
    [Account ID]
  , Stage

пь.может быть более одной строки с одинаковым высоким значением, но может быть возвращена только одна строка, если требуется более одной строки для связи, используйте dense_rank() вместо

0 голосов
/ 18 декабря 2018

Я считаю, что простой ROW NUMBER оконной функции должно быть достаточно.

;WITH MostTouchesByAccountStage AS
(
    SELECT
        T.[Account ID],
        T.Stage,
        T.TouchNumber,
        T.Type,
        T.TouchDate,
        Ranking = ROW_NUMBER() OVER ( -- Generate a ranking
            PARTITION BY
                T.[Account ID], -- That will reset with each different value of Account and Stage
                T.Stage
            ORDER BY
                T.TouchNumber DESC) -- And is ordered by TouchNumber descendently
    FROM
        YourTable AS T      
)
SELECT
    T.*
FROM
    MostTouchesByAccountStage AS T
WHERE
    T.Ranking = 1
...