sqlite 如何根据物料排序查找结果

k4aesqcs  于 2023-04-12  发布在  SQLite
关注(0)|答案(2)|浏览(162)

假设您有一个表,表中的Item具有UniqueNames,Id表示顺序,每个Run都有一个RunNumber
| 身份证|姓名|运行编号|
| --------------|--------------|--------------|
| 1|打开|1|
| 二|关闭|1|
| 1|打开|二|
| 二|关闭|二|
| 1|关闭|三|
| 二|打开|三|
| 1|打开|四|
| 二|关闭|四|
是否有方法在项目顺序发生更改时获取RunNumber,例如“关闭”任务的ID**小于“打开”任务的ID”(如RunNumber 3)?
希望能学到几种方法,但一种就够了!
谢谢!

cedebl8k

cedebl8k1#

对于此示例数据,您可以使用聚合并在HAVING子句中设置条件:

SELECT RunNumber
FROM Items
GROUP BY RunNumber
HAVING MAX(CASE WHEN Name = 'Close' THEN Id END) < MAX(CASE WHEN Name = 'Open' THEN Id END);

或者,使用自联接:

SELECT i1.RunNumber
FROM Items i1 INNER JOIN Items i2
ON i1.RunNumber = i2.RunNumber AND i1.id < i2.id
WHERE i1.Name = 'Close' AND i2.Name = 'Open';

参见demo

uhry853o

uhry853o2#

由于Close按字母顺序在Open之前,因此您可以使用row_number()为每个按RunNumber分组并按Name排序的记录给予行号:

with cte as (
  select *, row_number() over (partition by RunNumber order by id, Name) as rn
  from mytable
)
select *
from cte
where id = 1 and rn = 1 and Name = 'Close';

或者您可以使用order bycase when自己指定CloseOpen的顺序:

with cte as (
  select *,
  row_number() over (partition by RunNumber order by case Name when 'Close' then 1 when 'Open' then 2 end, id) as rn
  from mytable
)
select *
from cte
where id = 1 and rn = 1 and Name = 'Close';

Demo here

相关问题