【问题标题】:Deconstructing a complex SQL query into multiple queries and joins将一个复杂的 SQL 查询解构为多个查询和连接
【发布时间】: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。关于各个表格的清晰度:

  1. 第一个选择将在 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 不符合重复的条件。只有相同的元组是重复的。

  2. 第二个选择将查询 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 不是重复的。只有相同的元组是重复的。

  3. 在 person_id、visit_date = condition_date、visit_id = visit_id 上加入表 1 和表 2。然后计算每个日期出现了多少不同的 person_id。

  4. 从表 1 中,计算每个日期有多少个 visit_id。

希望这更清楚?再次感谢您的反馈。

【问题讨论】:

  • 很遗憾,如果您无法想象结果,我们将不知道我们是否编写了正确的结果。目前还不清楚你想要什么......但它可能是像count(vol1.visit_id) over (...) 这样的窗口函数,它在整个数据集中添加一个计数列,而不是向上滚动。样本数据和预期结果会有所帮助。
  • 如果降低不透明度是最终目标,那么通过弄清楚查询中发生的事情并添加适当的 cmets 可能会更好。通常,当您为查询优化器提供一个更大的问题来解决并让它帮助而不是将事情分解成可能被证明效率相当低的较小步骤时,性能会更好。如果存在性能问题,则从实际执行计划开始。

标签: sql-server tsql


【解决方案1】:

我怀疑这会表现得更好,但它接近您的要求。我会远离临时表(这是我从你的问题中推断出来的)。

with cteVO as --common table expression for visit_occurrence
(
    select distinct person_id, visit_date, visit_id
    from visit_occurrence
    where visit_id = 1234
),
cteCO as -- common table expression for condition_occurrence
(
    select distinct person_id, visit_id, condition_date
    from condition_occurrence 
    where condition_id = 12345
)
-- Join both CTEs to get the count of person_id and count of visit_id
SELECT cteVO.visit_date, COUNT(cteVO.person_id) AS count_person_id,
    COUNT(cteVO.visit_id) AS count_visit_id
FROM cteVO
INNER JOIN cteCO ON cteVO.person_id = cteCO.person_id 
    AND cteVO.visit_date = cteCO.condition_date
    AND cteVO.visit_id = cteCO.visit_id
GROUP BY cteVO.visit_date

【讨论】:

  • 为什么建议远离临时表?
猜你喜欢
  • 2018-10-14
  • 2023-03-05
  • 2010-11-02
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 2011-09-12
  • 2010-10-15
  • 2012-04-27
相关资源
最近更新 更多