每天的第一个和最后一个交易日期
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 on
和 union 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 获取当前月份的第一个和最后一个日期 [重复]