如何在表 Sql 中查找缺失的数据

Posted

技术标签:

【中文标题】如何在表 Sql 中查找缺失的数据【英文标题】:How to find missing data in table Sql 【发布时间】:2020-10-28 21:15:49 【问题描述】:

这类似于How to find missing data rows using SQL? 和How to find missing rows (dates) in a mysql table?,但有点复杂,所以我碰壁了。

我有一个带有注明主键的数据表:

country_id (PK)
product_id (PK)
history_date (PK)
amount

我有一个包含所有产品的产品表、一个国家/地区表和一个包含所有有效日期的日历表。

我想查找所有缺少产品的国家、日期和产品,并带有以下皱纹: 我只关心至少有一种产品的国家/地区条目的日期(即,如果该国家/地区当天没有任何东西,我不需要找到它) - 所以,根据定义,有一个条目在我关心的每个国家和日期的历史记录表。

我知道这将涉及一些连接,可能是交叉连接,但我在查找缺失数据时遇到了障碍。

我试过这个(很确定它不会起作用):

SELECT h.history_date, h.product_id, h.country_id, h.amount
FROM products p
LEFT JOIN history h ON (p.product_id = h.product_id)
WHERE h.product_id IS NULL

没有喜悦。

我也试过这个:

WITH allData AS (SELECT h1.country_id, p.product_id, h1.history_date
FROM products p 
CROSS JOIN (SELECT DISTINCT country_id, history_date FROM history) h1)
SELECT f.history_date, f.product_id, f.country_id
FROM allData f
LEFT OUTER JOIN history h ON (f.country_id = h.country_id AND f.history_date = h.history_date AND f.product_id = h.product_id)
WHERE h.product_id IS NULL 
   AND h.country_id IS NOT NULL 
   AND h.history_date IS NOT null

也没有运气。 CTE 确实在每个有数据的日期都为我提供了所有产品,但其余的都没有返回任何数据。

【问题讨论】:

【参考方案1】:

我只关心一个国家/地区有条目的日期 至少一种产品(即如果该国当天没有任何产品,我 不用找)

所以我们关心这个组合:

from    (select distinct country_id, history_date from history) country_date
cross join products p

那么就是检查存在性的问题了:

select *
from    (select distinct country_id, history_date from history) country_date
cross join products p
where not exists (select null
                  from history h
                  where country_date.country_id   = h.country_id
                   and  country_date.history_date = h.history_date
                   and  p.product_id              = h.product_id
                 ) 

【讨论】:

所以我很接近,但没有雪茄。太好了,谢谢! 要更正您的版本,您只需查看针对外部连接表使用的过滤器。 AND h.country_id IS NOT NULL 只有在所有外连接条件上都有匹配的行时才会为真。

以上是关于如何在表 Sql 中查找缺失的数据的主要内容,如果未能解决你的问题,请参考以下文章

SQL:在表中查找缺失的 ID

如何在sql表中查找缺失的元素

SQL Server:如何在表数据中用单引号查找和替换多引号

sql查询 如何获取查找某ID的一条记录在表中是第几条记录

SQL如何编写返回缺失日期范围的查询?

如何在熊猫数据框中查找缺失的索引值?