【问题标题】:Get last value in sequence按顺序获取最后一个值
【发布时间】:2021-11-07 03:32:02
【问题描述】:

我试图返回特定事件序列中的最后一个值,我最初的想法是使用 LAST_VALUE() 但我无法让它工作。我可以使用子查询和连接来做到这一点,但是是否有一个窗口函数可以让这个结果更容易?

现在查询正在提取最大数量,但我想要的是 last 基于 seq 列的数量

SQL Fiddle

数据

| PaymentID |          Description | Result | Seq |
|-----------|----------------------|--------|-----|
|         1 | Entered Payment Page |    Yes |   1 |
|         1 |       Amount Entered |     50 |   2 |
|         1 |       Amount Entered |     60 |   3 |
|         1 |       Amount Entered |     20 |   4 |
|         1 |     Amount Confirmed |    Yes |   5 |
|         2 | Entered Payment Page |    Yes |   1 |
|         2 |       Amount Entered |    100 |   2 |
|         2 |     Amount Confirmed |    Yes |   3 |
|         3 | Entered Payment Page |    Yes |   1 |
|         3 |       Amount Entered |      4 |   2 |
|         3 |     Amount Confirmed |     No |   3 |
|         3 |       Amount Entered |      8 |   4 |
|         3 |     Amount Confirmed |    Yes |   5 |

当前查询结果

| PaymentID | InPayment | Amount | Confirmed |
|-----------|-----------|--------|-----------|
|         1 |       Yes |     60 |       Yes |
|         2 |       Yes |    100 |       Yes |
|         3 |       Yes |      8 |       Yes |

想要的结果

| PaymentID | InPayment | Amount | Confirmed |
|-----------|-----------|--------|-----------|
|         1 |       Yes |     20 |       Yes |
|         2 |       Yes |    100 |       Yes |
|         3 |       Yes |      8 |       Yes |

【问题讨论】:

  • last表示最高seq值?
  • 是的,这是正确的
  • Teradata 还是 SQL Server?

标签: sql tsql teradata


【解决方案1】:

您可以使用row_number() 和条件聚合:

select paymentid,
       max(case when description = 'Entered Payment Page' then result end) as inpayment,
       max(case when description = 'Amount Entered' then result end) as amount_entered,
       max(case when description = 'Amount Confirmed' then result end) as amount_confirmed
from (select t.*,
             row_number() over (partition by paymentid, description order by seq desc) as seqnum
      from paymentinfo t
     ) t
where seqnum = 1
group by paymentid;

Here 是一个 SQL Fiddle。

【讨论】:

  • 完美,我确实通过使用 IGNORE NULLS 并查看前后所有行让 LAST_VALUE 工作,但这似乎要简单得多
  • SQL Server 不支持ignore nulls 并且问题有那个标签。
猜你喜欢
  • 2021-12-15
  • 2012-09-02
  • 1970-01-01
  • 2016-12-28
  • 1970-01-01
  • 1970-01-01
  • 2016-11-25
  • 2021-10-07
  • 1970-01-01
相关资源
最近更新 更多