【问题标题】:SQL Grouped Filter by Subquery按子查询的 SQL 分组过滤器
【发布时间】:2019-11-15 15:02:46
【问题描述】:

我有以下表格:

---------VBUK-----------  
ID      WBSTK   
77807   C  
77808   C  
80345   A  
80383   A  
80989   A  
85997   C  
91212   A  
91397   A  

----GRPID------  
GROUP | ID  
0001 | 77807  
0001 | 77808  
0001 | 80345  
0002 | 80383  
0002 | 80989  
0002 | 85997  
0001 | 91212  
0001 | 91397   

因此,我希望得到所有 ID 小于任何“C”的“A”。
只有 VBUK 才能使用此代码:

select  t1.ID, t1.WBSTK  
from VBUK t1  
inner join VBUK t2 on t2.ID > t1.ID and t2.WBSTK='C'   
where t1.WBSTK='A'  

但现在我想在组级别进行比较。 所以对于这个例子,我的输出应该是:

GROUP  |  ID   |  WBSTK   
0002   | 80383 |  A  
0002   | 80989 |  A  

对于 GROUP 0001 没有任何内容,因为没有比该组的 MAX C 更大的 A。

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。

标签: sql group-by subquery


【解决方案1】:

我会选择窗口函数:

select gv.*
from (select g.*, v.WBSTK,
             min(case when v.WBSTK = 'C' then vbuk.id end) over (partition by g.group) as min_c_id
      from groups g join
           vbuk v
           on g.id = v.id
     ) gv
where gv.WBSTK = 'A' and gv.id < min_c_id;

【讨论】:

  • 我不太确定,但它不应该是第 3 行中的 MAX(case when...) 吗?
  • @大卫。 . .不,问题是:“所以我想得到所有 ID 小于任何“C”的“A”。因此,您需要 C 的最小 id。
  • 你完全正确!我这边的逻辑错误!谢谢!
【解决方案2】:

我不确定是否明白你的意思,但对我来说,你似乎只需要添加组信息:

select  t1.ID, t1.WBSTK  , t3.group
from VBUK t1  
inner join VBUK t2 on t2.ID > t1.ID and t2.WBSTK='C'   
left join GRPID t3 on t3.id = t1.id
where t1.WBSTK='A' 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-08
    • 1970-01-01
    • 2010-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多