每天的第一个和最后一个交易日期

First and last transaction date for each day

我想显示每天的第一条和最后一条记录,而不考虑已售出的商品。基本上就是每天的第一个和最后一个交易时间。

示例销售数据:

product_id |product_name |date
1232       |laptop       |06/08/2019 17:05:57
1233       |telephone    |06/08/2019 16:05:57
1234       |laptop       |06/08/2019 15:05:47
1235       |laptop       |05/05/2019 05:05:22
1236       |laptop       |05/05/2019 03:05:21
1237       |telephone    |05/05/2019 20:05:20
1238       |telephone    |07/08/2019 01:06:09
1239       |laptop       |07/08/2019 05:05:59
1240       |telephone    |07/08/2019 20:05:37
1241       |laptop       |07/08/2019 23:05:29

结果:

product_id|product_name|date
1234      |laptop      |06/08/2019 15:05:47
1232      |laptop      |06/08/2019 17:05:57
1236      |laptop      |05/05/2019 03:05:21
1237      |telephone   |05/05/2019 20:05:20
1238      |telephone   |07/08/2019 01:06:09
1241      |laptop      |07/08/2019 23:05:29

尝试查询:

select 
product_id,
product_name,
MAX(date),
MIN(date)
FROM sales_data
WHERE DATE(date) = DATE(date)
GROUP BY product_id, product_name

一种方法是window函数:

select sd.*
from (select sd.*,
             row_number() over (partition by date::date order by date asc) as seqnum_asc,
             row_number() over (partition by date::date order by date desc) as seqnum_desc
      from sales_data sd
     ) sd
where 1 in (seqnum_asc, seqnum_desc);

但是,distinct onunion all 可能在索引 eson (date::date, date)(date::date, date desc):

中表现更好
(select distinct on (date::date) sd.*
 from sales_data sd
 order by date::date, date asc
)
union all
(select distinct on (date::date) sd.*
 from sales_data sd
 order by date::date, date desc
);