0

我有一个必须每天提交数据的医院列表 (FacilityID_UUID) (date = create_date)。

在给定的一天,我想确定哪一天没有报告。

从这个开始:

SELECT `FacilityID_UUID`
FROM `TEST`
where `FacilityID_UUID` not in (
  SELECT distinct `FacilityID_UUID`
  FROM `TEST`
  where `Create_Date` = '2014-09-16'
)

(将用 sysdate 或间隔 1 天替换日期)

但是,我有两个问题:

1-太慢了!现在已经跑了 30 分钟,我预计不会超过 20 个结果)。我怎样才能让它更快?

2- 它只向我提供过去至少提交一次但不是昨天提交的医院名称。如果更多的医院在周三开始提交,我希望周四的查询能够解决这个问题。基本上,我想说“给我昨天没有提交的清单 X 上的医院”,然后我自己写清单 X。

有任何想法吗

4

2 回答 2

0

您可以执行 LEFT JOIN 以获取到此日期已报告或未报告的每个测试,然后在第二个表上仅保留空值以仅查看在指定日期未报告的测试。

SELECT FacilityID_UUID
FROM TEST
LEFT JOIN TEST AS REPORT_DATE_TEST ON TEST.FacilityID_UUID = REPORT_DATE_TEST.FacilityID_UUID
AND REPORT_DATE_TEST.Create_Date = '2014-09-16
WHERE REPORT_DATE_TEST.FacilityID_UUID IS NULL;

上一个查询将给出与您的查询相同的结果,但速度更快。

但我怀疑您可能希望每个 UUID 只有一行,在这种情况下,它会是

SELECT DISTINCT FacilityID_UUID
FROM TEST
LEFT JOIN TEST AS REPORT_DATE_TEST ON TEST.FacilityID_UUID = REPORT_DATE_TEST.FacilityID_UUID
AND REPORT_DATE_TEST.Create_Date = '2014-09-16
WHERE REPORT_DATE_TEST.FacilityID_UUID IS NULL;
于 2014-09-16T20:03:35.910 回答
0

查询速度取决于很多因素,您将能够比这里的任何人更好地调整它。让我们看看您的数据和您的查询。

SELECT FacilityID_UUID FROM TEST where FacilityID_UUID not in 
         (SELECT distinct FacilityID_UUID FROM TEST where Create_Date = '2014-09-16')

此查询正在检查 TEST 的每一行并返回那些不在具有 Create_Date 的设施列表中的值。这肯定会很慢。对于 N 个项目,您正在与可能相当大的 N 的某个子集进行比较。如果 TEST 是一个大表(如果每个设施每天都有一个新条目,它将是),那么您将遇到速度问题。

更好的查询是:

Select FacilityID_UUID, max(Create_Date) from TEST where Create_Date < CURDATE() - 1
                 group by FacilityID_UUID order by FacilityID_UUID;

对于您的数据,这应该接近正确(可能需要修改 where 子句,我在 MySQL 中没有对日期做很多工作)。

于 2014-09-16T20:06:37.643 回答