【问题标题】:How to add the first value of a column in SQL over another grouping variable如何在另一个分组变量上添加 SQL 中列的第一个值
【发布时间】:2021-04-26 18:19:43
【问题描述】:

我有一个包含以下类型表的数据库:

customer_id customer_type customer_state state_date
1 A 0 2020-01-01
1 A 1 2020-01-05
1 B 2 2020-01-06
2 X 0 2019-02-07
2 Y 0 2019-02-07
2 X 0 2019-02-07

customer state 和 state_date 列表示客户当前状态随时间的演变,而customer_id 显然是客户的唯一标识符。

我有兴趣获取一个表(使用 SQL 查询),其中包含一个附加列 first_type,该列告诉每个客户它拥有的第一个状态,如下例所示:

customer_id customer_type customer_state state_date first_type
1 A 0 2020-01-01 A
1 A 1 2020-01-05 A
1 B 2 2020-01-06 A
2 X 0 2019-02-07 X
2 Y 0 2019-02-07 X
2 X 0 2019-02-07 X

可以在 SQL 中实现吗?我尝试过自加入,但我很难理解如何选择每个客户的第一行,或者通常是 n-th 行。

具体来说,我正在使用 Teradata SQL,如果某些特定功能可用于此任务。

【问题讨论】:

  • 您使用的是 MySQL 还是 SQL Server,或者正如您在结束时所说的那样,Teradata?拥有 7K+ 代表的人应该知道如何正确标记。
  • Teradata 不是 MySQL 或 SQL Server - 有一个 Teradata 标签。请向我们展示您的尝试并解释您遇到的问题。
  • 确实是在一周前开始使用数据库的。我的数据库是 Teradata,是的。据了解,虽然它是一种 SQL 方言,但标准 SQL 命令应该可以工作,对吧?
  • SQL 表代表 无序 集(技术上,多集)。根据您提供的信息,无法区分最后三行。没有“第一”。

标签: sql inner-join teradata self-join


【解决方案1】:

一种可能性,使用ROW_NUMBER

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY state_date) rn
    FROM yourTable
)

SELECT customer_id, customer_type, customer_state, state_date,
       MAX(CASE WHEN rn = 1 THEN customer_type END) OVER
           (PARTITION BY customer_id) first_type
FROM cte;

【讨论】:

    【解决方案2】:

    Teradata/Standard SQL 中有一个函数:

    SELECT 
       t.*
      ,FIRST_VALUE(customer_type)
       OVER (PARTITION BY customer_id
             ORDER BY state_date) AS first_type
    FROM mytable AS t
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-22
      • 2013-09-14
      • 2012-07-14
      • 1970-01-01
      • 1970-01-01
      • 2019-08-16
      • 2017-01-05
      • 1970-01-01
      相关资源
      最近更新 更多