问题描述
我有 2 张桌子:
表:患者更新
表格:TextMaster
我需要最终结果:
最终结果是医院变性手术科所有患者的当前状态,但患者姓名的标题是从TextMaster表中选择的。
来自此 sql:
SELECT disTINCT "PatientID",FirsT_VALUE("TextSource")
OVER (PARTITION BY "PatientID" ORDER BY CASE WHEN "TextSource" IS NOT NULL THEN "EffectiveDate" END DESC) "TextSource",FirsT_VALUE("TextGroup")
OVER (PARTITION BY "PatientID" ORDER BY CASE WHEN "TextGroup" IS NOT NULL THEN "EffectiveDate" END DESC) "TextGroup",FirsT_VALUE("TextIndex")
OVER (PARTITION BY "PatientID" ORDER BY CASE WHEN "TextIndex" IS NOT NULL THEN "EffectiveDate" END DESC) "TextIndex",FirsT_VALUE("FirstName")
OVER (PARTITION BY "PatientID" ORDER BY CASE WHEN "FirstName" IS NOT NULL THEN "EffectiveDate" END DESC) "FirstName",FirsT_VALUE("LastName")
OVER (PARTITION BY "PatientID" ORDER BY CASE WHEN "LastName" IS NOT NULL THEN "EffectiveDate" END DESC) "LastName"
FROM "PatientsUpdates";
我得到了这个查询结果:
你能帮我用正确的 sql 教我用 TextDetail 或比上面显示的更好的 sql 替换 TextSource、TextGroup 和 TextIndex 吗?
解决方法
如果 TextXXX
是 "TextMaster"
的外键的一部分,那么对于单行,它们要么全为空,要么填充在一起。在这种情况下,您只需 left join
到 "TextMaster"
即可获取信息。
SELECT DISTINCT pu."PatientID",FIRST_VALUE(tm."TextDetail")
OVER (PARTITION BY pu."PatientID" ORDER BY CASE WHEN "TextDetail" IS NOT NULL THEN "EffectiveDate" END DESC) "TextDetail",FIRST_VALUE(pu."FirstName")
OVER (PARTITION BY pu."PatientID" ORDER BY CASE WHEN pu."FirstName" IS NOT NULL THEN "EffectiveDate" END DESC) "FirstName",FIRST_VALUE(pu."LastName")
OVER (PARTITION BY pu."PatientID" ORDER BY CASE WHEN pu."LastName" IS NOT NULL THEN "EffectiveDate" END DESC) "LastName"
FROM "PatientsUpdates" pu
left join "TextMaster" tm
using ("TextSource","TextGroup","TextIndex");
我使用 LEFT JOIN
而不是 INNER JOIN
是因为您的问题中缺少信息,什么可以为空,什么组合可以为空,以避免意外删除会提供必要信息的行.但是,如果始终填充 "TextSource"
、"TextGroup"
和 "TextIndex"
,或者在还填充 "FirstName"
和/或 "LastName"
时始终填充,那么您可以使用INNER JOIN
代替。