如何通过比较相邻行来使用 SQlite SELECT 语句 select 唯一行

How to select unique rows with SQlite SELECT statement by comparing neighbouring rows

我有一个可以包含“几乎”重复行的 sqlite table。

存在这些“重复项”时的唯一区别是其中一行在外键列中具有 NULL 值:-

简化版的table如下:-

NAME       FK1         FK2           WATCH   
AAAAAAAA   NULL        10099999        1     
AAAAAAAA   8008        10099999        1
BBBBBBBB   1111        30088888        2 
CCCCCCCC   2222        75656463        1
DDDDDDDD   3333        34242434        2
GGGGGGGG   NULL        70099999        1     
GGGGGGGG   4224        70099999        1

在上面的示例中,我需要 select 的行是

NAME       FK1         FK2           WATCH   
AAAAAAAA   8008        10099999        1
CCCCCCCC   2222        75656463        1
GGGGGGGG   4224        70099999        1

例如WATCH = 1 和存在“重复”FK2 行的任何行我需要 FK1 不是 NULL

还有另一种情况,虽然相同的 SQL 语句必须处理

NAME       FK1         FK2           WATCH   
KKKKKKKK   NULL        87656463        1     
LLLLLLLL   5454        65453535        2
MMMMMMMM   NULL        48723747        1 
MMMMMMMM   9229        48723747        1
NNNNNNNN   2765        77000007        2
OOOOOOOO   NULL        83343343        1     
ZZZZZZZZ   8118        63737422        1

在上面的示例中,我需要 select 的行是

NAME       FK1         FK2           WATCH     
KKKKKKKK   NULL        87656463        1 
MMMMMMMM   9229        48723747        1
OOOOOOOO   NULL        83343343        1     
ZZZZZZZZ   8118        63737422        1

例如WATCH = 1 并且存在“重复”FK2 行的任何行我需要 FK1 不为空,除非只有 FK1 为空然后我需要那些行

是否可以在单个 SQLite 语句中实现?

这个声明似乎有效

SELECT  T1.name, T1.fk1, T1.fk2 
FROM  my_table T1
WHERE T1.watch = 1
AND T1.fk1 IS NOT NULL
UNION 
SELECT  T2.name, T2.fk1, T2.fk2 
FROM  my_table T2
WHERE T2.watch = 1
AND T2.fk1 IS NULL
AND T2.fk2  NOT IN (SELECT T3.fk2 FROM  my_table T3 WHERE T3.watch = 1 AND T3.fk1 IS NOT NULL)

是最好的方法吗?

你可以通过聚合来做到这一点:

SELECT NAME, MAX(FK1) FK1, FK2, WATCH
FROM my_table
WHERE WATCH = 1
GROUP BY NAME;

当在此类查询中使用聚合函数 MAX() 时,SQLite returns 返回包含最大值的行。

参见demo