【问题标题】:How to sort columns values in sql db2-400?如何对 sql db2-400 中的列值进行排序?
【发布时间】:2021-02-19 13:36:09
【问题描述】:

我有 10 列信息相似,我想在大于 0 时对它们进行升序排序。
例如,从这里:

A1 A2 A3 A4 A5 A6 A7 A8 A9 A0
00 01 00 09 08 05 00 02 06 03

到这里:

A1 A2 A3 A4 A5 A6 A7 A8 A9 A0
01 02 03 05 06 08 09 00 00 00

我一直在尝试通过minmax 功能无济于事。

【问题讨论】:

  • 修复你的数据模型!不同的数据应该存储在多行的一列中,而不是存储在单列中。
  • 很遗憾,无法更改数据模型。

标签: sql db2-400


【解决方案1】:

您可以取消透视数据并重新聚合:一种方法是:

select max(case when seqnum = 1 then a end) as a1,
       max(case when seqnum = 2 then a end) as a2,
       . . .
from (select a.a,
             row_number() over (order by a desc) as seqnum
      from (select a1 as a from t union all
            select a2 from t union all
            select a3 from t union all
            . . .
           ) a
     ) a;
        

【讨论】:

  • 抱歉没看懂 seqnum = 1 部分,需要解释一下吗?
  • @FranciscoCosta。 . .这就是你想要的重新排序。
  • 是的,我知道会这样做,但不确定“seqnum”应该是什么变量......
  • @FranciscoCosta。 . . seqnum 在子查询中定义。
  • 抱歉这个愚蠢的问题哈哈。我将您的示例用作解决方案,尽管经过一些调整,因为我需要按列和按行进行操作,因此与 nfgl 中的示例相比,它花费的时间要少得多。谢谢。
【解决方案2】:
with
base (key, a1, a2, a3, a4, a5, a6, a7, a8, a9, a0) as (
  values
  (1, '00', '01', '00', '09', '08', '05', '00', '02', '06', '03'),
  (2, '08', '02', '00', '06', '01', '02', '00', '04', '03', '09')
),
ordered (k, value, seq) as (
  select
    key,value,rownumber() over(partition by key order by nullif(value,'00')) seq
  from base cross
    join lateral (values a1,a2,a3,a4,a5,a6,a7,a8,a9,a0) v(value)
)
select
  key,
  (select value from ordered o where (k, seq) = (key, 1)) A1,
  (select value from ordered o where (k, seq) = (key, 2)) A2,
  (select value from ordered o where (k, seq) = (key, 3)) A3,
  (select value from ordered o where (k, seq) = (key, 4)) A4,
  (select value from ordered o where (k, seq) = (key, 5)) A5,
  (select value from ordered o where (k, seq) = (key, 6)) A6,
  (select value from ordered o where (k, seq) = (key, 7)) A7,
  (select value from ordered o where (k, seq) = (key, 8)) A8,
  (select value from ordered o where (k, seq) = (key, 9)) A9,
  (select value from ordered o where (k, seq) = (key, 10)) A0
from base
  

【讨论】:

  • 尽管您的示例完全按照要求工作,但处理时间很长,我有大量数据要处理,使用 SQL 的原因是为了提高效率,这意味着运行更短的时间。谢谢你的例子,学到了一些东西。
猜你喜欢
  • 2011-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-19
  • 1970-01-01
相关资源
最近更新 更多