#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'
);