Извлечение столбца из таблицы SQL на основе другого столбца, если эта же таблица - PullRequest
0 голосов
/ 17 января 2020

Я использую POSTGRESQL.

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

ID | CUSTOMER_ID | YEAR
1   1   2011
2   2   2012
3   2   2012
4   1   2013
5   3   2014
6   3   2014
7   3   2015

Мне нужно извлечь 'ID' покупки с помощью самое позднее ' дата / год ' для каждого ЗАКАЗЧИКА.

Например, для CUSTOMER_ID 1 год с 2013, который соответствует идентификатору ' 4 '.

Мне нужно получить ОДИН столбец в качестве структуры возвращаемых данных.

PS. я застрял с этой довольно простой задачей)))

Ответы [ 3 ]

1 голос
/ 17 января 2020

Это должно работать, но выглядит не очень красиво ...

SELECT DISTINCT ON(CUSTOMER_ID) ID FROM PURCHASES P
WHERE (CUSTOMER_ID,YEAR) = 
(SELECT CUSTOMER_ID,MAX(YEAR) FROM PURCHASES WHERE CUSTOMER_ID = P.CUSTOMER_ID 
GROUP BY CUSTOMER_ID);

Так что для ввода

ID | CUSTOMER_ID | YEAR
1   1   2011
2   2   2012
3   2   2012
4   1   2013
5   3   2014
6   3   2014
7   3   2015

Возвращается

id
4
2
7

Meaning: 
For the lowest CUSTOMER_ID (it is 1) the id is 4 (year 2013)
Next we have CUSTOMER_ID (it is 2) the id is 2 (year 2012)
Lastly the CUSTOMER_ID (it is 3) the id is 7 (year 2015)

Идея, лежащая в основе этого:

  1. Группировка по CUSTOMER_ID

  2. Для каждой группы выберите max (год)

  3. При циклическом просмотре всех записей - если Customer_id и year равны цифрам из номера 2., затем выберите ID из этой записи.

  4. Без DISTINCT ON (CUSTOMER_ID) будет возвращено 2 записи для CUSTOMER_ID = 2, потому что за оба года 2012 он будет находить некоторые записи во время цикла.

Если вы напишите в начале вместо:

SELECT DISTINCT ON(CUSTOMER_ID) ID FROM PURCHASES P

этот код:

SELECT DISTINCT ON(CUSTOMER_ID) * FROM PURCHASES P

тогда вы все ясно увидите.

1 голос
/ 17 января 2020

Если вам нужна одна строка для каждого клиента, вы можете использовать distinct on:

select distinct on (customer_id) id
from purchases
order by customer_id, year desc;

. Возвращает один столбец, который является id от самого последнего года для этого клиента.

0 голосов
/ 17 января 2020

Используйте функцию row_number() analyti c с разбиением на customer_id, чтобы выбрать для каждого клиента упорядочение по убыванию на year (если связи имеют значения year (например, они равны), то ниже запрос приносит наименьшее значение ID для каждого customer_id, например 4, 2, 7 соответственно)

WITH P2 AS
(
SELECT ROW_NUMBER() OVER (PARTITION BY CUSTOMER_ID ORDER BY YEAR DESC) AS RN,
       *
  FROM PURCHASES 
)
SELECT ID FROM P2 WHERE RN = 1

Демо

...