繁体   English   中英

Teradata:查询给定输入的两列的下一个最小值

[英]Teradata: Query the next lowest value of two columns for a given input

我有以下两个表:

       TableA:
+---------+--------+
|  name   | nm_key |
+---------+--------+
| Bob     |   1124 |
| Sally   |   3278 |
| Frank   |   6484 |
| Mary    |   1125 |
| Annette |   2798 |
+---------+--------+

             TableB:
 +--------+----------+--------+
 | nm_key | sequence | status |
 +--------+----------+--------+
 |   1124 |    33333 |      3 |
 |   2798 |    11111 |      1 |
 |   3278 |    12226 |      2 |
 |   1125 |    24356 |      3 |
 |   6484 |    12272 |      2 |
 +--------+----------+--------+

使用这两个表,我如何编写Teradata SQL查询,该查询将返回名称输入的第二低状态和第二最低顺序的名称? 例如,Bob的输入将返回Frank,因为下一个最低状态是2,下一个最低顺序是12272。

让我们只关注这里的num_key和表b 名称来自加入结果。 一种方法是相关子查询。 以下获取密钥

select b.*,
       (select top 1 b2.nm_key
        from b b2
        where b2.status < b.status
        order by b2.status desc, b2.sequence desc
       ) as prev_nm_key
from b;

限制为“鲍勃”并获得名称是对逻辑的较小调整。

编辑:

那是一个痛苦的局限。 这是一种解决方法:

select bb.*, b.nm_key
from (select b.*,
             (select max(b2.status || ':' || b2.sequence) as statseq
              from b b2
              where b2.status < b.status
              order by b2.status desc, b2.sequence desc
             ) as prev_nm_key
      from b
     ) bb join
     b
     on (b.status || ':' || b.sequence) = bb.statseq;

尝试这个:

Select * from table1 
Left join table2 on table2.nm_key=table1.nm_key
Where status=ceil(status +.99)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM