我尝试了两个查询,一个查询带有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;
结果:
如果我运行中间表并进行查询,则会得到相同的结果
--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;
答案 0 :(得分:0)
区别在于您的第一个查询选择的是不同的值,而第二个查询没有选择的是不同的值,这会返回可能的重复项-如此简单。
关于非重复计数:我不能仅基于图片就无法确定哪个查询是从哪个查询生成的,但是我希望与非非重复计数相比,非重复查询的计数值返回的值要小查询。
答案 1 :(得分:0)
您要在DISTINCT
级别不同的不同地方减少查询,如果您的数据有点奇怪,应该会出现这种行为。
select DISTINCT fe.encounter_id, ...
但这是一个子Select查询,主Select也具有一个Distinct
过滤器,但是主要结果因子查询的初始过滤器而减少。 Distinct
条件将过滤整个行,而主查询仅根据特定列进行过滤。
具有唯一性的子查询将删除所有完全相同的行,这是预期的结果。这里的问题是,您的第一个查询正在选择不同的值,但是您的第二个查询是不提取特定的不同的值,因此您的结果将提取可能没有重复值的重复项。坦白地说,如果您有这么多重复的问题,这很可能是数据结构方式的问题。
您可能会看到的 big 部分原因是DISTINCT,而GROUP会影响要提取的初始数据。但这仍然是当前编写这些查询的方式。
答案 2 :(得分:0)
DISTINCT
以两种不同的方式工作,并且您同时使用两种方式:
在内部/子查询中,您要对整个行应用DISTINCT
,而不是分别应用于每一列。因此,子查询可能返回encounter_id
和patient_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