【问题标题】:How to fetch records up to particular data如何获取特定数据的记录
【发布时间】:2021-10-01 06:31:41
【问题描述】:

表tb数据如下

id  remarks   status   key
------------------------------------
1    dfe        1       340              
2    ert        4       340
3    aaa        6       340
4    gh         7       340
5    bnh        2       341
6    xdc        6       341
7    qqq        1       341
8    rty        3       343
9    mnh        1       343
10   ppo        3       343
11   oit        6       343

我想通过分组键获得状态 6 的 id 列表。

select id 
from tb 
where status in (6) AND key in (select key_list from temporary_table)
group by key;

我没有得到所需的记录。

例如:我需要如下输出

key 340
id
---
1
2
3

For key 341
id
---
5
6

For key 343
id
---
8
9
10
11

注意:原始键列数据不按顺序排列,是乱序的。为了便于理解给定的列表。

【问题讨论】:

  • 如果给定键的状态从不为 6,那么期望的结果是什么?另外,当您说“for key ...”时,您是什么意思?那是一个输入变量(查询中的绑定变量),并且您一次需要一个键的结果集,还是需要查询返回单个结果集中所有键的行?

标签: sql oracle group-by


【解决方案1】:

假设

  1. 您需要一个查询来返回一个中所有键的相应 ID 单个查询;
  2. 如果给定键的状态从不为 6,那么您必须返回所有 该键对应的行

您可以使用match_recognize

select key, id
from   tb
match_recognize(
  partition by key
  order     by id
  all rows  per match
  pattern   ( ^ a* b? )
  define    a as status != 6
);

如果您必须将单个输入键作为变量提供给查询,并仅返回该键的结果,您可以像这样修改查询:

select id
from   (select id, status from tb where key = :input_key)
match_recognize(
  order     by id
  all rows  per match
  pattern   ( ^ a* b? )
  define    a as status != 6
);

【讨论】:

    【解决方案2】:

    您可以使用相关子查询:

    select tb.*  -- or whatever columns you want
    from tb
    where tb.id <= (select min(tb2.id)
                    from tb tb2
                    where tb2.key = tb.key and tb2.status = 6
                   );
    

    或者,您可以使用窗口函数:

    select tb.id
    from (select tb.*,
                 min(case when status = 6 then id end) over (partition by key) as id_6
          from tb
         ) tb
    where id <= id_6;
    

    【讨论】:

      猜你喜欢
      • 2020-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      相关资源
      最近更新 更多