【问题标题】:Select to search column on group by query选择按查询搜索分组上的列
【发布时间】:2019-12-24 23:39:37
【问题描述】:

我有一张名为 prices 的表格,它通过 product_id 列从表格产品中引用。我想要一个查询,选择按 product_id 分组的价格和最大最终日期,并通过一个带有价格分组 ID 的选择来获取 start_date 的值。

我尝试使用以下查询,但我得到了错误的开始日期值。很奇怪,因为结果子查询返回不止一行,即使我在 where 子句中使用价格 id。因为我对查询设置了限制但它是错误的。

select prices.produto_id, prices.id, 
MAX(CASE WHEN prices.finish_date IS NULL THEN COALESCE(prices.finish_date,'9999-12-31') ELSE prices.finish_date END) as finish_date, 
(select start_date from prices where prices.id = prices.id limit 1) 
 as start_date from prices group by prices.product_id, prices.id

如何在我的分组行中获取价格 ID 的相对开始日期?我正在使用 postgresql。

通过查询查看我想要的内容的示例:

数据集:

ID | PRODUCT_ID | START_DATE          | FINISH_DATE
1    1689         2018-01-19 02:00:00   2019-11-19 23:59:59
2    1689         2019-10-11 03:00:00   2019-10-15 23:59:59
3    1689         2019-01-11 03:00:00   2019-05-15 23:59:59
4    1690         2019-11-11 03:00:00   2019-12-15 23:59:59
5    1690         2019-05-11 03:00:00   2025-12-15 23:59:59
6    1691         2019-05-11 03:00:00   null

我想要这个结果:

ID | PRODUCT_ID | START_DATE          | FINISH_DATE
1    1689         2018-01-19 02:00:00   2019-11-19 23:59:59
5    1690         2019-05-11 03:00:00   2025-12-15 23:59:59
6    1691         2019-05-11 03:00:00   9999-12-31 23:59:59

开始日期应该与分组依据之前的行的值相同。

【问题讨论】:

  • 样本数据和期望的结果会真正澄清你的问题。
  • 好的。我添加了这些信息。

标签: sql postgresql


【解决方案1】:

我会在 Postgres 中推荐 DISTINCT ON

select distinct on (p.product_id) p.*
from prices p
order by p.product_id,
         p.finish_date desc nulls first;

NULL 值被视为大于任何其他值,因此降序排序将它们放在首位。但是,为了明确起见,我已经包含了nulls first

DISTINCT ON 是一个非常方便的 Postgres 扩展,您可以在 documentation 中了解更多信息。

【讨论】:

    【解决方案2】:

    试试这个

    with data as (
     SELECT id, product_id,
     max(COALESCE(finish_date,'9999-12-31')) as finish_date from prices group by 1,2)  
    select d.*, p.start_date from data d join prices p on p.id = d.id;
    
    

    这肯定不是最优雅的解决方案,但它应该可以工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-01
      • 1970-01-01
      • 2021-09-07
      • 2014-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多