Как использовать функцию row_number с двумя последовательными условиями - PullRequest
0 голосов
/ 03 марта 2020

Моя таблица выглядит следующим образом:

    ID  IN_TIME SOURCE  LOGIN_NAME
    303954772   2019-01-01 06:37:33.900 R   ATMUSER
    303954772   2019-01-01 06:43:51.667 R   ATMUSER
    303954866   2019-01-01 07:34:47.790 R   ATMUSER
    303955362   2019-01-01 08:58:03.597 R   ATMUSER
    303955648   2019-01-01 10:26:23.533 R   ATMUSER
    303955700   2019-01-01 10:40:10.230 R   BAYI
    303955700   2019-01-02 10:40:10.933 R   BAYI
    303955700   2019-01-02 10:40:11.307 R   BAYI
    303954484   2019-01-01 11:06:07.440 R   ATMUSER
    303955854   2019-01-02 11:10:53.233 H   GUEST
    303933812   2019-01-02 11:11:27.247 R   ATMUSER
    303933812   2019-01-01 11:13:20.247 R   ATMUSER

То, что я хочу видеть, выглядит следующим образом:

    ID  IN_TIME SOURCE  LOGIN_NAME  ROW_NUMBER
303954866   2019-01-01 06:37:33.900 R   ATMUSER 1
303955362   2019-01-01 06:43:51.667 R   ATMUSER 2
303955648   2019-01-01 07:34:47.790 R   ATMUSER 3
303955700   2019-01-01 08:58:03.597 R   ATMUSER 4
303955700   2019-01-01 10:26:23.533 R   ATMUSER 5
303954484   2019-01-01 11:06:07.440 R   ATMUSER 6
303954772   2019-01-01 11:11:27.247 R   ATMUSER 7
303955700   2019-01-01 10:40:10.230 R   BAYI    1
303954772   2019-01-02 11:13:20.247 R   ATMUSER 1
303955854   2019-01-02 10:40:10.933 R   BAYI    1
303933812   2019-01-02 10:40:11.307 R   BAYI    2
303933812   2019-01-02 11:10:53.233 H   GUEST   1

Как я могу сделать это, используя функцию номера строки? Или что-то еще, что может дать только строки 1 в столбце row_number, также может работать.

Ответы [ 2 ]

1 голос
/ 03 марта 2020

Это форма пробелов и островков. Для этого, разница в количестве строк кажется достаточной:

select t.*,
       row_number() over (partition by source, login_name, seqnum - seqnum2 order by in_time) as row_number
from (select t.*,
             row_number() over (order by in_time) as seqnum,
             row_number() over (partition by source, login_name order by in_time) as seqnum2
      from t
     ) t;
0 голосов
/ 03 марта 2020

Похоже, что вы просто хотите разделить на части date in_time и login_name. Может работать что-то похожее на приведенное ниже:

select a.*,
       row_number() over (partition by cast(in_time as date),login_name order by in_time) as rownum
from table a
order by cast(in_time as date),login_name,in_time

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...