Выберите Top 3 из объединенных таблиц, примените ранжирование на основе значения столбца - PullRequest
0 голосов
/ 20 февраля 2020

Table1

ID         | JoinedStart        | CohortID | CohortName
---------- | ------------------ | -------- | ----------
1          | 20080101 01:30:00  | 1        | Peanut
1          | 20090204 01:01:00  | 2        | Apple
2          | 20190107 05:52:14  | 1        | Peanut
3          | 20190311 02:35:26  | 2        | Apple
6          | 20190311 02:35:26  | 2        | Apple

Таблица 2

ID         | event_start   | StartDateTimestamp2
---------- | ------------- | -------------------
1          | HiredStart    | 20080501 01:30:00
1          | DeferredStart | 20090604 01:01:00
2          | HiredStart    | 20190115 05:52:14
3          | HiredStart    | 20190330 02:35:26
6          | DeferredStart | 20190330 02:35:26

Попытка 1

SELECT CohortID, RANK() OVER(ORDER BY CohortID ASC) RANK, t1.id, event_start, startdatetimestamp2
FROM table1 e JOIN table 2 ON table2.id = table1.id

Затем я попытался:

SELECT CohortID, (CASE WHEN CohortID = 1 THEN RANK() OVER(ORDER BY(StartDateTimestamp2) ASC)
                       WHEN CohortID = 2 THEN RANK() OVER(ORDER BY(StartDateTimestamp2) ASC) END)
FROM table1 JOIN table2 ON table1.user_id = table2.user_id

Ожидаемый результат

CohortID   | RANK | ID | CohortName | startdatetimestamp2     
---------- | -----|----|------------|-------------------
1          | 1    | 1  | Peanut     | 20080501 01:30:00
1          | 2    | 2  | Peanut     | 20090604 01:01:00
1          | 3    | 6  | Apple      | 20190115 05:52:14
2          | 1    | 3  | Apple      | 20190330 02:35:26
2          | 2    | 5  | Peanut     | 20190115 05:52:14

Ранг перезапускается, когда CohortId изменяется с 1 на 2, с 123 на 12.

Мой запрос выше просто занимает странную последовательность. Как мне сделать так, чтобы он перезапускался каждый раз, когда топ-3 отличается от CohortID?

1 Ответ

1 голос
/ 20 февраля 2020

Вам необходимо создать запрос, который генерирует присвоение ранга для каждой группы, а затем подзапрос и сохраняет только ранги 3 или менее:

WITH cte AS (
    SELECT t1.CohortID, t1.ID, t1.CohortName, t2.startdatetimestamp2,
        RANK() OVER (PARTITION BY t1.CohortID ORDER BY t2.StartDateTimestamp2) rnk
    FROM table1 t1
    INNER JOIN table2 t2 ON t1.id = t2.id
)

SELECT CohortID, rnk AS "RANK", ID, CohortName, startdatetimestamp2    
FROM cte
WHERE "RANK" <= 3
ORDER BY CohortID, "RANK";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...