【问题标题】:Sorting column A based on a column B which contains previous values from column A根据包含列 A 的先前值的列 B 对列 A 进行排序
【发布时间】:2019-05-17 10:26:14
【问题描述】:

我想根据包含 A 列先前值的 B 列对 A 列进行排序。

这就是我所拥有的:

+----+----------+----------+
| ID |    A     |    B     |
+----+----------+----------+
|  1 | 17209061 |          |
|  2 | 53199491 | 51249612 |
|  3 | 61249612 | 17209061 |
|  4 | 51249612 | 61249612 |
+----+----------+----------+

这就是我想要的:

+----+----------+----------+----------+
| ID |    A     |    B     | Sort_seq |
+----+----------+----------+----------+
|  1 | 17209061 |          |        1 |
|  3 | 61249612 | 17209061 |        2 |
|  4 | 51249612 | 61249612 |        3 |
|  2 | 53199491 | 51249612 |        4 |
+----+----------+----------+----------+

我确信有一种简单的方法可以做到这一点。你有什么想法吗?

谢谢!

【问题讨论】:

  • 我认为你有 idsort_seq 倒退。
  • 本该如此。第一个表中的 ID 与排序顺序无关。我需要以正确的方式对其进行排序以获取最后一个 ID,它应该是 2。
  • 。 . SQL 表代表 无序 集。需要id 来定义“先前值”的含义。

标签: sql sorting plsql lag lead


【解决方案1】:

只需在order by 中使用lag()

order by lag(a) over (order by id) nulls first

如果你想要一个列,那么:

select t.id, t.a, t.prev_a,
       row_number() over (order by prev_a nulls first)
from (select t.*, lag(a) over (order by id) as prev_a
      from t
     ) t;

【讨论】:

    猜你喜欢
    • 2017-10-03
    • 2015-03-05
    • 1970-01-01
    • 1970-01-01
    • 2019-05-10
    • 1970-01-01
    • 1970-01-01
    • 2018-08-06
    • 2022-01-03
    相关资源
    最近更新 更多