【问题标题】:Group by unique customers and then create column for min date按唯一客户分组,然后为最小日期创建列
【发布时间】:2019-11-12 14:25:32
【问题描述】:

我有一张带有客户 ID 的表,transaction_date

表格示例:

ID    |transaction_date
PT2073|2015-02-28    
PT2073|2019-02-28    
PT2013|2015-04-28    
PT2013|2017-02-11   
PT2013|2017-07-11    

目标:我想创建另一列,以便为每个唯一 ID 获得第一个交易日期。它应该看起来像:

表格示例:

ID    |transaction_date|first_transaction_date
PT2073|2015-02-28    |2015-02-28 
PT2073|2019-02-28    |2015-02-28 
PT2013|2015-04-28    |2015-04-28
PT2013|2017-02-11    |2015-04-28
PT2013|2017-07-11    |2015-04-28

我创建了另一个表,在其中选择最小值,然后对其进行分组:

SELECT id, MIN(transaction_date) as first_transaction_date FROM customer_details GROUP BY id

当我检查表格时,我在 first_transaction_date 列中没有得到相同的值以获得唯一 ID。

【问题讨论】:

    标签: sql amazon-redshift


    【解决方案1】:

    min() 用作窗口函数

    select t.*, min(t.transaction_date) over (partition by t.id)
    from t;
    

    不需要group by

    【讨论】:

      【解决方案2】:

      使用first_value() window function:它给出有序组的第一个值(您的组是由transaction_date 排序的ids):

      Click for demo:db<>fiddle

      SELECT
          *,
          first_value(transaction_date) OVER (PARTITION BY id ORDER BY transaction_date)
      FROM
          mytable
      

      如果您的 Postgres 版本不支持窗口函数(8.4 之前,Amazon Redshift):

      Click demo:db<>fiddle

      SELECT
          t1.*,
          (SELECT min(transaction_date) FROM mytable t2 WHERE t1.id = t2.id)
      FROM
          mytable t1
      

      【讨论】:

      • 我收到错误:无效操作:带有 ORDER BY 子句的聚合窗口函数需要一个框架子句
      • 见上面的演示链接。这是有效的。你改变了什么?你能试着用小提琴重现这个问题吗?
      • 在这种情况下不是和min(transaction_date) over (partition by id)一样吗?
      • 我没有改变任何东西。我在 sql 工作台上运行它
      • @a_horse_with_no_name 是的,当然;)所以,OP,尝试用小提琴重现问题(显示真实数据和表结构以及您使用的代码:)
      猜你喜欢
      • 2012-07-15
      • 1970-01-01
      • 1970-01-01
      • 2021-06-29
      • 2019-06-06
      • 2023-03-14
      • 2018-04-15
      • 1970-01-01
      • 2019-08-19
      相关资源
      最近更新 更多