определить начиная с даты записи, установленной в PostgreSQL - PullRequest
0 голосов
/ 04 марта 2020

У меня есть таблица данных о клиенте с тремя столбцами

empid(integer),productid (integer) and purchasedate(date)

с записями типа

empid productid purchasedate
1153    67      2010-01-14 
1153    67      2010-02-15
1153    67      2010-02-25
1153    67      2010-03-18
1153    67      2010-04-08
1153    67      2010-04-28
1153    28      2011-07-21
1153    28      2011-09-12
1153    28      2011-11-11
1153    28      2011-12-22
1153    28      2012-01-21
1153    66      2012-03-21
1153    66      2012-06-22
1153    66      2012-08-24
1153    66      2012-10-11
1153    28      2012-11-09
1153    66      2013-01-04
1153    66      2013-03-21
1153    66      2013-04-20
1153    29      2013-06-12
1153    29      2013-08-01
1153    29      2013-10-25
1153    29      2014-01-24
1153    29      2017-01-30
1153    67      2017-06-19
1153    67      2017-10-11
1153    67      2017-12-02
1153    28      2018-09-15
1153    28      2018-10-20
1153    29      2018-12-20
1153    29      2019-03-21
1153    29      2019-03-22
1153    29      2019-04-17
1153    29      2019-06-17
1153    29      2019-07-11
1153    66      2019-08-21
1153    66      2019-10-01
1153    66      2019-11-07
1153    66      2019-12-04
1153    66      2020-01-14 

Теперь я должен определить, начиная с даты покупки, которая покупает один и тот же продукт с даты максимальной покупки дата id продукта.

максимальная дата покупки 2020-01-14, а productctid равен 66, и с даты, которая является

empid pruductid purchasedate
1153    66      2019-08-21

, я хочу определить, как определить вышеуказанную запись в PostgreSQL.

Ответы [ 2 ]

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

Кажется, вам нужно определить каждую empid & productid группу комбинаций, содержащую их минимум минимум даты покупки .

Затем вы можете решить это с помощью пробелов и островков с помощью row_number () analyti c в качестве

SELECT empid, productid, MIN(purchasedate) as purchasedate
  FROM ( 
      SELECT
            p.*,
            ROW_NUMBER() OVER ( PARTITION BY empid ORDER BY purchasedate ) rn1,
            ROW_NUMBER() OVER ( PARTITION BY empid, productid ORDER BY purchasedate ) rn2
       FROM purchase p
    ) t
  GROUP BY empid, productid, rn1 - rn2
  ORDER BY purchasedate;

Demo

0 голосов
/ 04 марта 2020

Хотя вы можете рассматривать это как проблему пробелов и островков, вы можете просто посмотреть на последний продукт и получить все последние строки, которые соответствуют.

select p.*
from (select p.*,
             count(*) filter (where productid <> last_productid) over (partition by empid order by purchasedate) as num_otherproducts
      from (select p.*,
                   first_value(productid) over (partition by empid order by purchasedate desc) as last_productid
            from purchase p 
           ) p
     ) p
where num_otherproducts = 0;

Если вы использовали пробел и Подход к островам, я бы рекомендовал сделать это следующим образом:

SELECT p.*
FROM (SELECT p.*,
             ROW_NUMBER() OVER ( PARTITION BY empid ORDER BY purchasedate desc ) as seqnum1,
             ROW_NUMBER() OVER ( PARTITION BY empid, productid ORDER BY purchasedate desc ) as seqnum2
      FROM purchase p
     ) p
WHERE seqnum1 = seqnum2
ORDER BY p.purchasedate;

Идея состоит в том, чтобы перечислять строки для каждого empid с конца. И перечислить строки для каждой комбинации empid / productid. Когда они одинаковы, у вас есть конечный продукт.

...