sql лучшая стратегия для разделения одинаковых значений на основе временной последовательности - PullRequest
0 голосов
/ 22 сентября 2018

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

ID  LEVEL  DATE
1   10     10/1/2000
1   10     11/20/2001
1   10     12/01/2001
1   30     02/15/2002
1   30     02/15/2002
1   20     05/17/2002
1   20     01/04/2003
1   30     07/20/2003
1   30     03/16/2004
1   30     04/15/2004

Я хочу получить счетчик для каждого блока ID / LEVEL / DATEэто выглядит так:

ID   LEVEL  COUNT
1    10        3
1    30        2
1    20        2
1    30        3

Проблема в том, что если я использую функцию подсчета окон и делю на уровни, она группирует 30 вместе, независимо от временной последовательности.Я хочу, чтобы количество для уровня 30 до и после 20 было разным.Кто-нибудь знает как это сделать?

1 Ответ

0 голосов
/ 22 сентября 2018

Стандартное gaps and islands решение с использованием ROW_NUMBER(), если оно доступно в вашей конкретной СУБД ...

WITH
  ordered AS
(
  SELECT
    *,
    ROW_NUMBER() OVER (PARTITION BY id        ORDER BY date)   AS set_ordinal,
    ROW_NUMBER() OVER (PARTITION BY id, level ORDER BY date)   AS grp_ordinal
  FROM
    yourData
)
SELECT
  id,
  level,
  set_ordinal - grp_ordinal,
  MIN(date),
  COUNT(*)
FROM
  ordered
GROUP BY
  id,
  level,
  set_ordinal - grp_ordinal
ORDER BY
  id,
  MIN(date)

Визуализация эффекта двух номеров строк ...

ID  LEVEL  DATE        set_ordinal  grp_ordinal  set-grp    GROUP
--  -----  ----------  -----------  -----------  -------    --------
 1     10  10/01/2000            1     1               0    1,10,0
 1     10  11/20/2001            2     2               0    1,10,0
 1     10  12/01/2001            3     3               0    1,10,0

 1     30  02/15/2002            4         1           3    1,30,3
 1     30  02/15/2002            5         2           3    1,30,3

 1     20  05/17/2002            6       1             5    1,20,5
 1     20  01/04/2003            7       2             5    1,20,5

 1     30  07/20/2003            8         3           5    1,30,5
 1     30  03/16/2004            9         4           5    1,30,5
 1     30  04/15/2004           10         5           5    1,30,5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...