我的数据如下:

USER_ID value  date         cost
001         A  01-01-2021     10
002         C  01-01-2021     11
001         D  01-02-2021     21
002         G  01-02-2021     23
001         H  01-03-2021     32

我想做的就是 for each 用户确定哪value个发生在第二位,哪value个发生在第三位.这可由date确定.拿到这个之后,我们还需要那些日子的费用.

结果表应如下所示:

USER_ID   second_val  third_val second_cost  third_cost
001                D          H          21          32
002                G         NA          23           0

请注意,USER_ID 002没有第三个值,这将被视为NA.因此,NA val的成本为0.

推荐答案

这应该足够了:

CREATE OR REPLACE TABLE TEMP1 
AS 
SELECT USER_ID, value,  date, cost
  FROM (VALUES 
        ('001', 'A', '01-01-2021', 10),
        ('002', 'C', '01-01-2021', 11),
        ('001', 'D', '01-02-2021', 21),
        ('002', 'G', '01-02-2021', 23),
        ('001', 'H', '01-03-2021', 32)) t(USER_ID, value, date, cost);
               
SELECT DISTINCT USER_ID
     , IFNULL(NTH_VALUE(value, 2) OVER(PARTITION BY USER_ID ORDER BY date), 'NA') AS second_val
     , IFNULL(NTH_VALUE(value, 3) OVER(PARTITION BY USER_ID ORDER BY date), 'NA') AS third_val
     , IFNULL(NTH_VALUE(cost, 2) OVER(PARTITION BY USER_ID ORDER BY date), 0) AS second_cost
     , IFNULL(NTH_VALUE(cost, 3) OVER(PARTITION BY USER_ID ORDER BY date), 0) AS third_cost
  FROM TEMP1;

Sql相关问答推荐

Select 最大值,但当并列时,从其他列 Select 最大值

Postgres trunc_date删除一个月

使用`lag()`获取上一个时间戳

如何使用ROW_NUM() Select 一个没有第二条记录的实例?

Oracle SQL-将结果列在单行中

使用占位符向SQL INSERT查询添加 case

SQL将 Select 查询作为新列添加到另一个 Select 查询

获得第三名或最老的记录

对表进行多项 Select 以返回最大值和时间

仅在日期相隔时递增(Oracle SQL)

我如何才能在付款人单列中拉出只有9个付款人单的人?

TSQL如何为群分配号码

为什么SQL in中的空子查询有时被视为null

Snowflake 中的分层数据

DbUp for sqlserver 在 dbo 授权下为非 dbo 用户创建架构

在 Oracle 21c 中透视文本值

如何使用 Google BigQuery 中的条件根据特定列值连接列的 N 行?

编写查询以根据级别 (p2) 返回父位置

获取 SQL Server 中每一行的两个-之间的文本

如何筛选 GROUP BY 结果? HAVING 没有产生预期的结果