如何获取特定数据的记录

Posted

技术标签:

【中文标题】如何获取特定数据的记录【英文标题】: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 ...”时,您是什么意思?那是一个输入变量(查询中的绑定变量),并且您一次需要一个键的结果集,还是需要查询返回单个结果集中所有键的行? 【参考方案1】:

假设

    您需要一个查询来返回一个中所有键的相应 ID 单个查询; 如果给定键的状态从不为 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;

【讨论】:

以上是关于如何获取特定数据的记录的主要内容,如果未能解决你的问题,请参考以下文章

如何从 firebase 实时数据库中获取数据并更改一个文本字段以表示该特定记录?

如何在codeigniter活动记录中获取特定数组

如何以角度从 algolia 获取特定数据

ExtJs分组中的clearfilter后如何获取特定组的所有记录

Django ORM:如何根据所有记录中的列获取唯一记录(需要模型对象而不是特定值对象)

如何在 SQL Server 中从今天的日期获取 > 240 天的数据,其中某些记录的特定单元键在 240 天之内和之外