【发布时间】:2018-06-22 20:14:02
【问题描述】:
有人可以帮忙把这个复杂的 SQL 查询分解成单独的步骤吗?我正在尝试构建多个表并加入这个感觉非常不透明的多步查询。谢谢!
select
visit_date,
count(vo1.visit_id) as num_visits,
sum(case when co1.person_id is not null then 1 else 0 end) as num_visits_w_cond
from
visit_occurrence vo1
left join
(select distinct
person_id, visit_id, condition_date
from
condition_occurrence
where
condition_id = 12345)) co1 on vo1.person_id = co1.person_id
and vo1.visit_date = co1.condition_date
and vo1.visit_id = co1.visit_id
where
visit_id = 1234
group by
visit_date
order by
visit_date;
理想情况下,我想在中间步骤中生成一些数据表,然后在最后加入并计数,但我不确定这会是什么样子。
编辑:感谢您的 cmets。关于各个表格的清晰度:
第一个选择将在 visit_occurrence 表中查询与 visit_id # 为“1234”的所有 visit_id,并为所有访问返回不同的 person_id、visit_date 和 visit_id。因此,person_id、visit_date、visit_id 元组是唯一的,即具有不同 visit_date 或不同 visit_id 的相同 person_id 不符合重复的条件。只有相同的元组是重复的。
第二个选择将查询 condition_occurrence 表以查找与 condition_id # 为 12345 匹配的所有 condition_id,并返回不同的 person_id、visit_id、condition_date。因此,person_id、visit_id、condition_date 元组是唯一的,即具有不同 visit_id 或 condition_date 的相同 person_id 不是重复的。只有相同的元组是重复的。
在 person_id、visit_date = condition_date、visit_id = visit_id 上加入表 1 和表 2。然后计算每个日期出现了多少不同的 person_id。
从表 1 中,计算每个日期有多少个 visit_id。
希望这更清楚?再次感谢您的反馈。
【问题讨论】:
-
很遗憾,如果您无法想象结果,我们将不知道我们是否编写了正确的结果。目前还不清楚你想要什么......但它可能是像
count(vol1.visit_id) over (...)这样的窗口函数,它在整个数据集中添加一个计数列,而不是向上滚动。样本数据和预期结果会有所帮助。 -
如果降低不透明度是最终目标,那么通过弄清楚查询中发生的事情并添加适当的 cmets 可能会更好。通常,当您为查询优化器提供一个更大的问题来解决并让它帮助而不是将事情分解成可能被证明效率相当低的较小步骤时,性能会更好。如果存在性能问题,则从实际执行计划开始。
标签: sql-server tsql