如何根据特定列中的存在删除具有空白值的记录? - SQL

How to remove records with blank values based on existence in specific column? - SQL

我想删除 prevnext 中所有包含空白值的记录 - 但仅针对 curr 值在其他地方仍然存在的情况。例如,

输入:

prev   curr   next   rand_value
       B             1231
       B             323
A      B             3232
       B      C      3233
       D             12313

输出:

prev   curr   next   rand_value
A      B             3232
       B      C      3233
       D             12313

到目前为止我的代码:

SELECT * 
FROM my_table
WHERE prev IS NOT NULL
OR next IS NOT NULL
-- but this doesn't catch the final row
-- maybe use something like EXISTS?

每个唯一的 rand_value 将获得行号 1 到 X... 按上一个值、下一个值排序。如果两者都是“NULL”,它将得到一个 row_number 1。由于空值首先出现,我们必须分配一个降序。

也许有 1 种方式....

WITH CTE AS (
SELECT *, row_number() over (partition by rand_value order by prev DESC, next DESC) RN
FROM my_table)

SELECT * FROM CTE WHERE RN =1

替代方法:获取所有非空值,然后获取所有空值并集...

SELECT * 
FROM my_table 
WHERE prev IS NOT NULL
   OR next IS NOT NULL  

UNION ALL

SELECT * 
FROM my_table
WHERE prev IS NULL
  AND next is NULL

您可以使用 NOT EXISTS:

SELECT t1.* 
FROM tablename t1
WHERE t1.prev IS NOT NULL 
   OR t1.next IS NOT NULL
   OR NOT EXISTS (
        SELECT 1
        FROM tablename t2
        WHERE t2.curr = t1.curr AND (t2.prev IS NOT NULL OR t2.next IS NOT NULL)
      );

参见demo