Использование rank () в SQL - PullRequest
       2

Использование rank () в SQL

0 голосов
/ 03 апреля 2019

Приведенный ниже запрос дает мне значение repeated для всех дней.Как найти верхние 3 repeated значения, которые фактически повторяются в столбце repeated.

Примечание
Мне не нужны значения top 3 из repeated столбец.Я хочу увидеть 3 верхних повторяющихся значения в столбце repeated.

select days, count(*) as repeated from 
(
select 
datediff(day, EnrollDate, InsertDate) as days
from 
(
select 
m.id as memberid,
min(m.EnrollDate) as enrolldate, min(fc.InsertDate) as insertdate
from membersinclude m
join case fc
on m.id = fc.MemberId
and CancelDate < '2019-01-01 00:00:00.000'
and EnrollDate > '2015-01-01 00:00:00.000'
group by m.id
) a
) b
group by days

ОБНОВЛЕНИЕ

days    mode
19      11
0       10
211     10
42      10
34      10
29      10
35      9
183     9
49      9

Если это результат вышеприведенного запроса, я хочу, чтобы он возвратил 10, 9, 11 в этом порядке, потому что 10было больше результатов, чем 9, которые имели больше результатов, чем 11

Ответы [ 2 ]

0 голосов
/ 03 апреля 2019
;WITH cte AS (
    select 
    m.id as memberid,
    DATEDIFF(DAY, MIN(m.EnrollDate), MIN(fc.InsertDate)) AS days
    from membersinclude m
    join [case] fc
    on m.id = fc.MemberId
    and CancelDate < '2019-01-01 00:00:00.000'
    and EnrollDate > '2015-01-01 00:00:00.000'
    group by m.id
),
cte_grouped AS (
    SELECT days, COUNT(*) AS cnt
    FROM cte
    GROUP BY days
),
cte_ranked AS (
    SELECT days, RANK() OVER (ORDER BY cnt desc) rnk
    FROM cte_grouped
)
SELECT TOP(3) days
FROM cte_ranked
ORDER BY rnk

С этим примером данных:

CREATE TABLE membersinclude (id INT, enrolldate DATE, canceldate DATE)
CREATE TABLE [case] (memberid INT, insertdate DATE)

INSERT INTO membersinclude VALUES (1, '1/1/2016', '1/1/2018')
INSERT INTO membersinclude VALUES (2, '1/1/2016', '1/1/2018')
INSERT INTO membersinclude VALUES (3, '1/1/2016', '1/1/2018')
INSERT INTO membersinclude VALUES (4, '1/1/2016', '1/1/2018')
INSERT INTO membersinclude VALUES (5, '1/1/2016', '1/1/2018')
INSERT INTO membersinclude VALUES (6, '1/1/2016', '1/1/2018')
INSERT INTO membersinclude VALUES (7, '1/1/2016', '1/1/2018')
INSERT INTO membersinclude VALUES (8, '1/1/2016', '1/1/2018')
INSERT INTO membersinclude VALUES (9, '1/1/2016', '1/1/2018')
INSERT INTO membersinclude VALUES (10, '1/1/2016', '1/1/2018')

INSERT INTO [CASE] VALUES (1, '2/1/2016')
INSERT INTO [CASE] VALUES (2, '2/1/2016')
INSERT INTO [CASE] VALUES (3, '2/1/2016')
INSERT INTO [CASE] VALUES (4, '2/1/2016')
INSERT INTO [CASE] VALUES (5, '3/1/2016')
INSERT INTO [CASE] VALUES (6, '3/1/2016')
INSERT INTO [CASE] VALUES (7, '3/1/2016')
INSERT INTO [CASE] VALUES (8, '4/1/2016')
INSERT INTO [CASE] VALUES (9, '4/1/2016')
INSERT INTO [CASE] VALUES (10, '5/1/2016')

Группирует его в cte_grouped:

days    cnt
31      4
60      3
91      2
121     1

Затем возвращает топ-3, ранжированные cnt desc:

days
31
60
91
0 голосов
/ 03 апреля 2019

использовать top ключевое слово

with cte as
(
select days, count(*) as repeated from 
(
select 
datediff(day, EnrollDate, InsertDate) as days
from 
(
select 
m.id as memberid,
min(m.EnrollDate) as enrolldate, min(fc.InsertDate) as insertdate
from membersinclude m
join case fc
on m.id = fc.MemberId
and CancelDate < '2019-01-01 00:00:00.000'
and EnrollDate > '2015-01-01 00:00:00.000'
group by m.id
) a
) b
group by days
),cte1 as
 ( select mode, count(*) as cnt  from cte
    group by mode 
 ) select top 3 * from cte1
   order by cnt desc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...