如何根据特定列中的存在删除具有空白值的记录? - SQL
How to remove records with blank values based on existence in specific column? - SQL
我想删除 prev
和 next
中所有包含空白值的记录 - 但仅针对 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。
我想删除 prev
和 next
中所有包含空白值的记录 - 但仅针对 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。