在嵌套查询中使用distinct返回不同的结果

时间:2018-08-03 18:49:34

标签: sql distinct

我尝试了两个查询,一个查询带有distinct,一个查询没有distinct,并且得到了两个不同的结果。可能是什么原因?没有DISTINCT的答案似乎是正确的答案,但是为什么结果不同?

另一个令人困惑的部分是,如果我将子查询另存为两个中间表并执行count(distinct),则可以获得相同的结果。与前两个查询中没有DISTINCT的查询相同。

这是我的两个查询

SELECT 
    tmp.year, 
    COUNT(DISTINCT(tmp.encounter_id)) AS Nencounter,
    COUNT(DISTINCT(tmp.patient_sk)) AS Npatient
FROM 
    (SELECT DISTINCT 
         fe.encounter_id, dd.year, dp.patient_sk
     FROM
         cerner_db.f_encounter fe
     JOIN
         cerner_db.d_date dd ON fe.admitted_dt_id = dd.date_id
     JOIN
         cerner_db.d_patient dp ON dp.patient_id = fe.patient_id) tmp
GROUP BY 
    year
ORDER BY 
    year;

第二个

SELECT 
    tmp.year, 
    COUNT(DISTINCT(tmp.encounter_id)) AS Nencounter,
    COUNT(DISTINCT(tmp.patient_sk)) AS Npatient
FROM 
    (SELECT
         fe.encounter_id, dd.year, dp.patient_sk
     FROM
         cerner_db.f_encounter fe
     JOIN
         cerner_db.d_date dd ON fe.admitted_dt_id = dd.date_id
     JOIN
         cerner_db.d_patient dp ON dp.patient_id = fe.patient_id) tmp
GROUP BY 
    year
ORDER BY 
    year;

结果:

enter image description here

如果我运行中间表并进行查询,则会得到相同的结果

--try1
CREATE TABLE cerner_bds_db.overall STORED as PARQUET AS
SELECT tmp.year, count(distinct(tmp.encounter_id)) as Nencounter, count(distinct(tmp.patient_sk)) as Npatient
FROM (
    select DISTINCT fe.encounter_id, dd.year, dp.patient_sk
    from cerner_db.f_encounter fe
    join cerner_db.d_date dd on fe.admitted_dt_id=dd.date_id
    join cerner_db.d_patient dp on dp.patient_id=fe.patient_id) tmp
GROUP BY year
ORDER BY year;

--try2
CREATE TABLE cerner_bds_db.overall STORED as PARQUET AS
SELECT tmp.year, count(distinct(tmp.encounter_id)) as Nencounter, count(distinct(tmp.patient_sk)) as Npatient
FROM (
    select fe.encounter_id, dd.year, dp.patient_sk
    from cerner_db.f_encounter fe
    join cerner_db.d_date dd on fe.admitted_dt_id=dd.date_id
    join cerner_db.d_patient dp on dp.patient_id=fe.patient_id) tmp
GROUP BY year
ORDER BY year;

select year, count(DISTINCT(patient_sk)) from try1 GROUP BY year;
select year, count(DISTINCT(patient_sk)) from try2 GROUP BY year;

enter image description here

4 个答案:

答案 0 :(得分:0)

区别在于您的第一个查询选择的是不同的值,而第二个查询没有选择的是不同的值,这会返回可能的重复项-如此简单。

关于非重复计数:我不能仅基于图片就无法确定哪个查询是从哪个查询生成的,但是我希望与非非重复计数相比,非重复查询的计数值返回的值要小查询。

答案 1 :(得分:0)

您要在DISTINCT级别不同的不同地方减少查询,如果您的数据有点奇怪,应该会出现这种行为。

select DISTINCT fe.encounter_id, ...

但这是一个子Select查询,主Select也具有一个Distinct过滤器,但是主要结果因子查询的初始过滤器而减少。 Distinct条件将过滤整个行,而主查询仅根据特定列进行过滤。

具有唯一性的子查询将删除所有完全相同的行,这是预期的结果。这里的问题是,您的第一个查询正在选择不同的值,但是您的第二个查询是提取特定的不同的,因此您的结果将提取可能没有重复值的重复项。坦白地说,如果您有这么多重复的问题,这很可能是数据结构方式的问题。

您可能会看到的 big 部分原因是DISTINCT,而GROUP会影响要提取的初始数据。但这仍然是当前编写这些查询的方式。

答案 2 :(得分:0)

DISTINCT以两种不同的方式工作,并且您同时使用两种方式:

  • 在内部/子查询中,您要对整个行应用DISTINCT ,而不是分别应用于每一列。因此,子查询可能返回encounter_idpatient_sk的重复值。它只会消除重复的组合。

  • 在外部查询中,当您将DISTINCT 值分别应用于每列时,它们会对其计数。

当然,您会发现差异。

碰巧第一列为您提供相同的结果,而第二列为您提供不同的结果。但通常,通常在两列中都会得到不同的结果。

答案 3 :(得分:0)

您正在考虑这个问题。记录不能在整行上重复,并且每一列仍然没有唯一值。

分别查看查询结果和子查询,然后单击。

http://sqlfiddle.com/#!18/f2315/4

CREATE TABLE TEST_DATA
  ( id VARCHAR(100),
    val VARCHAR(100),
    found VARCHAR(100)
  );

INSERT INTO TEST_DATA VALUES (2018,'A','A');
INSERT INTO TEST_DATA VALUES (2018,'B','C');
INSERT INTO TEST_DATA VALUES (2018,'B','B');
INSERT INTO TEST_DATA VALUES (2018,'B','B');
INSERT INTO TEST_DATA VALUES (2018,'A','A');
INSERT INTO TEST_DATA VALUES (2018,'C','NULL');

SELECT id, 
       COUNT(val),
       COUNT(found)
  FROM (SELECT DISTINCT id, val, found FROM TEST_DATA) TMP
 GROUP
    BY id;

vs. 

SELECT id, 
       COUNT(DISTINCT(val)),
       COUNT(DISTINCT(found))
  FROM (SELECT id, val, found FROM TEST_DATA) TMP
 GROUP
    BY id