我试图使用窗函数来彼此接近(在同一分区中)转换成连续的组的组记录。可能有更好的方法来解决这个问题,但是现在我想尝试的是运行得太慢而无法使用。它涉及通过在选择的顺序:SQL索引相同的列两个方向遍历窗函数
order by person_id, rollup_class, rollup_concept_id, exp_num
,另一次序由窗口函数:
lead(days_from_latest) over (partition by person_id, rollup_class, rollup_concept_id
order by exp_num DESC)
因为我有最后一列(exp_num
)在相反的方向排列,查询需要永远。我甚至在桌面上有两个索引来处理这两个方向:
create index deeIdx on results.drug_exposure_extra (person_id,rollup_class, rollup_concept_id,
exp_num);
create index deeIdx2 on results.drug_exposure_extra (person_id,rollup_class,rollup_concept_id,
exp_num desc);
但是这没有帮助。所以我正在尝试在两个方向上订购exp_num的产品:
create index deeIdx3 on results.drug_exposure_extra (person_id,rollup_class,rollup_concept_id,
exp_num, exp_num desc);
这样做是否合理?当指数最终完成建设,能否解决这个问题,我会回答我的问题...
都能跟得上。
即使所有三个指标,如果两个顺序停车处(在选择并在条款)去同一个方向,运行查询超级快,如果他们走相反的方向在查询运行超慢。所以,在这一点上,我想我应该更好地解释我的用例,并寻求更好的方法。
我有药物暴露记录(这是一个很酷的开源项目http://www.ohdsi.org/,顺便说一句),并且当一个人的药物暴露开始时间比从前任何暴露结束N天少,它应该是结合早先的那些到一个单一的'时代'。每当有超过N天的差距时,新的时代就会开始。
在撰写这个问题的过程中,原来我解决它。但是,它提出了一些有趣的问题,所以我会发布它并在下面回答。
你应该问一下另一个关于样本数据和期望结果的问题。可能有其他解决方案来解决这个问题,您可能不会想到的解决方案。 –
我不确定它是否值得另一个问题,但我只是汇集了数据,并将您的建议添加到我的答案中 - 从我的现实生活中的示例中简化了很多,但却捕获了问题。 – Sigfried