【问题标题】:Selecting ID with a certain entry DB2选择带有某个条目的 ID DB2
【发布时间】:2021-07-15 10:44:15
【问题描述】:

我试图解决这个问题有一段时间了,但我确实缺乏使用 DB2 的经验,看起来这应该是一件容易的事,但仍然想不出办法。

举个例子,我有一张桌子:

+------+------+
|ID    |LEVEL |
+------+------+
|1     |L     |
+------+------+
|1     |R     |
+------+------+
|2     |T     |
+------+------+
|1     |T     |
+------+------+
|2     |R     |
+------+------+

我正在尝试选择一个 ID 条目,但要求级别 L 的条目如果存在则应首先选择,然后是 T,然后是 R。它应该如下所示:

+------+------+
|ID    |LEVEL |
+------+------+
|1     |L     |
+------+------+
|2     |T     |
+------+------+

有没有简单的方法来实现这一点?我尝试先连接结果,得到如下表格:

+------+------+
|ID    |LEVEL |
+------+------+
|1     |L,R,T |
+------+------+
|2     |T,R   |
+------+------+

然后将 CASE 与 Like 一起使用,但这不起作用。提前致谢!

【问题讨论】:

    标签: sql db2 case


    【解决方案1】:

    一种方法使用row_number()

    select t.*
    from (select t.*,
                 row_number() over (partition by id
                                    order by case level when 'L' then 1 when 'T' then 2 when 'R' then 3 else 4 end
                                   ) as seqnum
          from t
         ) t
    where seqnum = 1;
    

    但是,有时我喜欢这种情况下的条件聚合方法:

    select id,
           coalesce(max(case when level = 'L' then level end),
                    max(case when level = 'T' then level end),
                    max(level)
                   ) as level
    from t
    group by id;
    

    【讨论】:

      猜你喜欢
      • 2021-08-03
      • 1970-01-01
      • 1970-01-01
      • 2011-11-22
      • 2019-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多