【问题标题】: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,您应该返回每个产品的最小值和最大值。

标签: sql postgresql date datetime aggregate-functions


【解决方案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
);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-31
    • 2014-03-29
    • 1970-01-01
    • 2021-09-11
    • 1970-01-01
    • 1970-01-01
    • 2010-10-10
    • 1970-01-01
    相关资源
    最近更新 更多