【问题标题】:How to get first row of data for each month (postgres)如何获取每个月的第一行数据(postgres)
【发布时间】:2020-12-08 15:58:14
【问题描述】:

我是 postgres 的初学者,想获得每个月的第一行(分组依据),但我不确定如何。

我的表order如下:

order_id | cust_id | order_date
------------------------------------------------
order1   | cust1   | January 19, 2020, 1:00 PM
order2   | cust1   | January 30, 2020, 2:00 PM
order3   | cust1   | February 20, 2020, 3:00 PM
order4   | cust1   | February 28, 2020, 4:00 PM
order5   | cust2   | February 27, 2020, 4:00 PM

预期结果应如下:

order_id | cust_id | order_date
------------------------------------------------
order1   | cust1   | January 19, 2020, 1:00 PM
order3   | cust1   | February 20, 2020, 3:00 PM
order5   | cust2   | February 27, 2020, 4:00 PM

但我无法使用下面的查询获得上述结果,我得到的结果与表格相同:

select distinct on (order_date)cust_id, order_date, order_id from order
group by delivery_date, customer_id, delivery_id
order by delivery_date asc

【问题讨论】:

  • 这能回答你的问题吗? Select first row in each GROUP BY group?
  • @astentx 我无法通过链接线程获得预期结果。它还给了我另一个我希望避免的额外专栏。但它非常相似。谢谢
  • 如果您不需要某些列,您可以将它们从选择列表中排除。使用您需要的列名。 result is not as I expected 怎么样:更好地描述确切的问题,而不是一般的“不工作”。

标签: sql postgresql group-by distinct-on


【解决方案1】:

关闭。使用月份并摆脱group by

select distinct on (cust_id, date_trunc('month', order_date) ) cust_id, order_date, order_id
from order
order by cust_id, date_trunc('month', order_date), delivery_date asc

【讨论】:

  • 非常感谢@gordon!像魅力一样工作。
【解决方案2】:

你可以使用row_number解析函数如下:

Select * from
(Select t.*,
       row_number() over (partition by cust_id, date_trunc('month', order_date) 
                                  order by order_date) as rn
From your_table t) t
Where rn = 1

【讨论】:

  • 谢谢@popeye。这也有效。如果我可以隐藏创建的额外列也会很棒
  • 您可以根据自己的需要在select子句中写入列名。
猜你喜欢
  • 1970-01-01
  • 2017-05-17
  • 2014-11-05
  • 1970-01-01
  • 2023-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-11
相关资源
最近更新 更多