【问题标题】:Oracle 10g sql queryOracle 10g sql查询
【发布时间】:2021-02-19 08:17:18
【问题描述】:

我有一些这样的数据↓

T_ID    T_PERIOD    T_COUNT    T_SUM        T_UPDATE_COUNT
1       2013-2014   3436       20118043         0
2       2014-2015   4298       27101356         0
3       2015-2016   5577       38844640         0
4       2016-2017   5764       40701339         0
5       2017-2018   6997       54316874         0
6       2018-2019   13315      151012820        0
7       2019-2020   13933      162731044        0
8       2018-2019   13300      150000000        1
9       2013-2014   3600       21000000         1
10      2018-2019   13500      155000000        2

这个表只有insert,插入时T_UPDATE_COUNT = max(T_UPDATE_COUNT) + 1;

我希望数据看起来像这样↓

T_ID    T_PERIOD    T_COUNT    T_SUM        T_UPDATE_COUNT
9       2013-2014   3600       21000000         1
2       2014-2015   4298       27101356         0
3       2015-2016   5577       38844640         0
4       2016-2017   5764       40701339         0
5       2017-2018   6997       54316874         0
10      2018-2019   13500      155000000        2
7       2019-2020   13933      162731044        0

SQL语句怎么写?

【问题讨论】:

  • 你能解释一下预期结果背后的逻辑是什么吗?
  • 这些数据是从另一个表“group by”中获得的。都是历史数据,基本不会变,但是会变。我不想做“删除、更新”操作。所以当时我的想法是,如果周期数据发生变化,我会把最新的周期数据写入表中,字段't'_UPDATE_Count'+1用于区分。
  • 谢谢解决,因为数据量很小,我想也许可以加个is_delete字段,当数据变化时'update is'_这样查询语句就会更简单。
  • 英文是翻译软件生成的,希望是对的

标签: sql database oracle


【解决方案1】:

假设您需要为每个 T_PERIOD 获取最大值为 T_UPDATE_COUNT 的所有行,您可以尝试:

select T_ID, T_PERIOD, T_COUNT, T_SUM, T_UPDATE_COUNT
from 
(
    select T_ID, T_PERIOD, T_COUNT, T_SUM, T_UPDATE_COUNT,
           row_number() over (partition by T_PERIOD order by T_UPDATE_COUNT desc) as RN
    from yourData x
)
where RN = 1

有不同的方法可以做到这一点;我相信这个已经足够清楚了:内部查询用于计算具有相同值T_PERIODpartition by T_PERIOD)的所有行的集合中的行号,并将其命名为RN。 外部的只是过滤这个结果,只得到每个组的第一行 (RN = 1)。

【讨论】:

  • 谢谢,这就是我想做的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-11
  • 2013-10-31
  • 2011-07-14
  • 2013-03-01
  • 1970-01-01
相关资源
最近更新 更多