Репликация столбца, имеющего нулевые значения при определенных условиях, в другом столбце - PullRequest
0 голосов
/ 26 мая 2020

Используемая база данных: SQL Сервер.

У меня есть следующие значения в моей таблице:

ID  SESSION_ID  UID CREATED_DATE            MESSAGE_TYPE    MESSAGE                 QID
A10001  s1      U1  2020-05-25 06:14:23.430     U       fjdlasjfljdlajfljda         NULL
A10002  s1      U1  2020-05-25 06:14:29.480     B       fjdlasjfljdlajfljda         NULL
A10003  s1      U1  2020-05-25 06:14:32.317     U       fjdlasjfljdlajfljda         NULL
A10004  s1      U1  2020-05-25 06:14:39.297     B       fjdlasjfljdlajfljda         NULL
A10005  s1      U1  2020-05-25 06:14:43.123     B       fjdlasjfljdlajfljda         NULL
A10006  s1      U1  2020-05-25 06:14:47.420     U       fjdlasjfljdlajfljda         NULL
A10007  s1      U1  2020-05-25 06:15:19.237     B       fjdlasjfljdlajfljda         NULL
A10008  s1      U1  2020-05-25 06:15:29.467     B       fjdlasjfljdlajfljda         NULL
A10009  s1      U1  2020-05-25 06:15:29.467     B       fjdlasjfljdlajfljda         NULL
A10010  s2      U1  2020-05-25 06:15:37.040     U       fjdlasjfljdlajfljda         NULL
A10011  s2      U1  2020-05-25 06:15:53.583     B       fjdlasjfljdlajfljda         NULL
A10012  s2      U1  2020-05-25 06:15:56.520     B       fjdlasjfljdlajfljda         NULL
A10013  s3      U2  2020-05-25 06:16:00.213     U       fjdlasjfljdlajfljda         NULL
A10014  s3      U2  2020-05-25 06:16:03.547     B       fjdlasjfljdlajfljda         NULL
A10015  s3      U2  2020-05-25 06:16:06.430     U       fjdlasjfljdlajfljda         NULL

Я пытаюсь вставить значение Id в свой столбец QID по следующим критериям :

  • Тип_сообщения - U - QID будет пустым
  • для всех последующих сообщений типа «B», QID будет иметь значение из столбца ID, где тип сообщения - «U»

Ниже приведен пример вывода:

    ID  SESSION_ID  UID CREATED_DATE            MESSAGE_TYPE    MESSAGE                 QID
    A10001  s1      U1  2020-05-25 06:14:23.430     U       fjdlasjfljdlajfljda         NULL
    A10002  s1      U1  2020-05-25 06:14:29.480     B       fjdlasjfljdlajfljda         A10001
    A10003  s1      U1  2020-05-25 06:14:32.317     U       fjdlasjfljdlajfljda         NULL
    A10004  s1      U1  2020-05-25 06:14:39.297     B       fjdlasjfljdlajfljda         A10003
    A10005  s1      U1  2020-05-25 06:14:43.123     B       fjdlasjfljdlajfljda         A10003
    A10006  s1      U1  2020-05-25 06:14:47.420     U       fjdlasjfljdlajfljda         NULL
    A10007  s1      U1  2020-05-25 06:15:19.237     B       fjdlasjfljdlajfljda         A10006
    A10008  s1      U1  2020-05-25 06:15:29.467     B       fjdlasjfljdlajfljda         A10006
    A10009  s1      U1  2020-05-25 06:15:29.467     B       fjdlasjfljdlajfljda         A10006
    A10010  s2      U1  2020-05-25 06:15:37.040     U       fjdlasjfljdlajfljda         NULL
    A10011  s2      U1  2020-05-25 06:15:53.583     B       fjdlasjfljdlajfljda         A10010
    A10012  s2      U1  2020-05-25 06:15:56.520     B       fjdlasjfljdlajfljda         A10010
    A10013  s3      U2  2020-05-25 06:16:00.213     U       fjdlasjfljdlajfljda         NULL
    A10014  s3      U2  2020-05-25 06:16:03.547     B       fjdlasjfljdlajfljda         A10013
    A10015  s3      U2  2020-05-25 06:16:06.430     U       fjdlasjfljdlajfljda         NULL

Я пробовал использовать row_number(), ranking. Но не повезло. Пожалуйста, помогите мне решить эту проблему.

1 Ответ

2 голосов
/ 26 мая 2020

Для этого вы можете использовать оконные функции. Я бы рекомендовал использовать сумму окна, которая увеличивается каждый раз, когда встречается message_type 'U', для определения групп, а затем first_value():

select
    id, session_id, uid, created_date, message_type, message,
    case when message_type = 'B' 
        then first_value(id) over(partition by grp order by created_date) 
    end qid
from (
    select 
        t.*,
        sum(case when message_type = 'U' then 1 else 0 end) 
            over(order by created_date) grp
    from mytable t
) t

Демо на DB Fiddle :

id     | session_id | uid | created_date            | message_type | message             | qid   
:----- | :--------- | :-- | :---------------------- | :----------- | :------------------ | :-----
A10001 | s1         | U1  | 2020-05-25 06:14:23.430 | U            | fjdlasjfljdlajfljda | <em>null</em>  
A10002 | s1         | U1  | 2020-05-25 06:14:29.480 | B            | fjdlasjfljdlajfljda | A10001
A10003 | s1         | U1  | 2020-05-25 06:14:32.317 | U            | fjdlasjfljdlajfljda | <em>null</em>  
A10004 | s1         | U1  | 2020-05-25 06:14:39.297 | B            | fjdlasjfljdlajfljda | A10003
A10005 | s1         | U1  | 2020-05-25 06:14:43.123 | B            | fjdlasjfljdlajfljda | A10003
A10006 | s1         | U1  | 2020-05-25 06:14:47.420 | U            | fjdlasjfljdlajfljda | <em>null</em>  
A10007 | s1         | U1  | 2020-05-25 06:15:19.237 | B            | fjdlasjfljdlajfljda | A10006
A10008 | s1         | U1  | 2020-05-25 06:15:29.467 | B            | fjdlasjfljdlajfljda | A10006
A10009 | s1         | U1  | 2020-05-25 06:15:29.467 | B            | fjdlasjfljdlajfljda | A10006
A10010 | s2         | U1  | 2020-05-25 06:15:37.040 | U            | fjdlasjfljdlajfljda | <em>null</em>  
A10011 | s2         | U1  | 2020-05-25 06:15:53.583 | B            | fjdlasjfljdlajfljda | A10010
A10012 | s2         | U1  | 2020-05-25 06:15:56.520 | B            | fjdlasjfljdlajfljda | A10010
A10013 | s3         | U2  | 2020-05-25 06:16:00.213 | U            | fjdlasjfljdlajfljda | <em>null</em>  
A10014 | s3         | U2  | 2020-05-25 06:16:03.547 | B            | fjdlasjfljdlajfljda | A10013
A10015 | s3         | U2  | 2020-05-25 06:16:06.430 | U            | fjdlasjfljdlajfljda | <em>null</em>  
...