SQL DB2: нужны последние записи до изменения значения столбца

#sql #db2

#sql #db2

Вопрос:

Необходимо выбрать все последние записи, принадлежащие клиенту, имеющие уникальное значение в столбце ANDRI (значение = P), пока значение в столбце ANDRI не изменится (значение = Q). Записи должны быть сгруппированы на основе идентификатора имени клиента (уникального идентификатора), который присутствует в таблице B. Две таблицы могут быть объединены идентификатором столбца, который является ПЕРВИЧНЫМ КЛЮЧОМ.

Вот моя таблица DB2 A:

  --------- --------------- ------ ----- --------- ------- 
| ID      | Client Type   | ANDRI|  Date (Timestamp)     |
 --------- --------------- ------ ----- --------- ------- 
| 878     |  Personal     | P    | 2020-09-22 16:47:08   |
| 576     |  Personal     | P    | 2020-09-22 10:47:08   |
| 745     |  Personal     | P    | 2019-05-21 14:47:08   |
| 142     |  Business     | Q    | 2019-09-20 16:11:08   |
| 711     |  Personal     | Q    | 2018-02-12 15:27:08   |
| 441     |  Personal     | P    | 2018-01-29 10:57:08   |
| 371     |  Personal     | P    | 2017-05-20 11:17:08   |
| 115     |  Personal     | P    | 2016-10-12 14:47:08   |
 --------- --------------- ------ ----- --------- ------- 
  

Вот моя таблица DB2 B:

  --------- --------------- ------ ----- --------- ------- 
| ID      | Client Name ID| ODER|  Date (Timestamp)     |
 --------- --------------- ------ ----- --------- ------- 
| 878     |     Alice     | A    | 2020-09-22 16:47:08   |
| 576     |     Alice     | A    | 2020-09-22 10:47:08   |
| 745     |     Alice     | A    | 2019-05-21 14:47:08   |
| 142     |     Sandra    | B    | 2019-09-20 16:11:08   |
| 711     |     Alice     | B    | 2018-02-12 15:27:08   |
| 441     |     Alice     | A    | 2018-01-29 10:57:08   |
| 371     |     Sandra    | A    | 2017-05-20 11:17:08   |
| 115     |     Sandra    | A    | 2016-10-12 14:47:08   |
 --------- --------------- ------ ----- --------- ------- 
  

Я ожидаю, что ниже вывод:

 | ID      | Client Name ID| Date (Timestamp)     |
 --------- --------------- ------ ----- --------- 
| 878     |  Alice        | 2020-09-22 16:47:08  |
| 576     |  Alice        | 2020-09-22 10:47:08  |
| 745     |  Alice        | 2019-05-21 14:47:08  |
  

Если возможно, было бы полезно, если бы мы могли использовать функцию ROW_NUMBER() в SQL.

Мой SQL, который я использую (но он нуждается в некоторой настройке):

 SELECT T.*
FROM TABLEB T
JOIN 
(
    SELECT Client Name ID 
    FROM ( 
        SELECT Date, Client Name ID
             , ROWNUMBER() OVER (PARTITION BY Client Name ID 
                                 ORDER BY Date DESC) RN
        FROM TABLEB
    )
    WHERE RN IN (1, 2)
    GROUP BY Client Name ID
    HAVING MIN(ODER) = MAX(ODER) AND COUNT(1) = 2 AND MIN(ODER) = 'A'
) G 
    ON G.client name ID = T.client name ID
    AND T.ID IN (SELECT ID FROM TABLEA WHERE ANDRI = 'P')
ORDER BY T.Client Name ID;
  

Комментарии:

1. Привет @sam243475 У вас есть инструкции create table? У вас есть инструкции insert into table? Вы пробовали какой-либо код самостоятельно?

2. Пожалуйста, опубликуйте весь свой код. Вам нужно написать SQL самостоятельно, мы улучшаем его.

3. Добавлен SQL-код

4. Если идентификатор имени клиента равен 1 столбцу, вам нужно заключить имя в кавычки, если это 3 столбца, вам нужно добавить «,» между ними.

Ответ №1:

 select b.*
from a join
     b
     on a.id = b.id
where a.date > (select max(a2.date)
                from a a2
                where a2.andri <> 'P'
               );
  

Учитывая, что в обеих таблицах указаны одинаковые даты, вам может не понадобиться join во внешнем запросе:

 select b.*
from b
where b.date > (select max(a2.date)
                from a a2
                where a2.andri <> 'P'
               );