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

Posted

技术标签:

【中文标题】每天的第一个和最后一个交易日期【英文标题】:First and last transaction date for each day 【发布时间】:2021-03-04 20:43:50 【问题描述】:

我想显示每天的第一条和最后一条记录,而不管已售出什么。基本上是每天的第一个和最后一个交易时间。

销售数据示例:

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

【问题讨论】:

您尝试过的查询有什么问题?删除where 条件并正确转换date,您应该返回每个产品的最小值和最大值。 【参考方案1】:

一种方法是窗口函数:

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

【讨论】:

以上是关于每天的第一个和最后一个交易日期的主要内容,如果未能解决你的问题,请参考以下文章

如何获取当年的第一个和最后一个日期?

获取周和年的第一个和最后一个日期

如何获得每天包含多个列的事件的第一个实例,包括日期时间并返回这些列加上完整的日期时间值?

使用 JavaScript 或 jQuery 获取当前月份的第一个和最后一个日期 [重复]

Java - 在指定的给定月份 - 年份范围内打印每个月的第一个和最后一个日期

如何在Bash脚本中获取上个月的第一个和最后一个日期?