![](/img/trans.png)
[英]What is the proper syntax for PostgreSQL stored procedures (functions)?
[英]Proper syntax for windows functions
我有以下查詢可與基表PS_GHS_HS_IMMUN一起正常工作,但是當我離開OUTER JOIN時,我得到很多重復,並且我想知道由於使用Windows函數而語法是否正確。
PS_GHS_HS_IMMUN和PS_JOB之間的鍵是EMPLID和EMPL_RCD,因此我不希望重復,除非我沒有正確設置查詢的格式。
SELECT A.EMPLID, A.EMPL_RCD, EXAM_DT, IMMUN_CODE, RN
FROM (
SELECT ROW_NUMBER() OVER (PARTITION BY EMPLID, EXAM_DT, IMMUN_CODE ORDER BY EMPLID DESC) AS RN
, EMPLID
, EMPL_RCD
, EXAM_DT
, IMMUN_CODE
FROM PS_GHS_HS_IMMUN AS RN1 ) AS A
LEFT OUTER JOIN PS_JOB B ON A.EMPLID = B.EMPLID AND A.EMPL_RCD = B.EMPL_RCD
WHERE A.RN = 1
GROUP BY A.EMPLID,A.EXAM_DT, A.IMMUN_CODE, A.EMPL_RCD, A.RN
ORDER BY A.EXAM_DT
只是尋找有關查詢語法是否格式錯誤的指導。
樣本數據:
EMPLID EMPL_RCD EXAM_DT IMMUN_CODE RN
015 1 2018-09-19 00:00:00.000 FLDD 1
015 1 2018-09-19 00:00:00.000 FLDD 1
015 0 2018-09-19 00:00:00.000 FLDD 2
015 0 2018-09-20 00:00:00.000 PREV 1
015 1 2018-09-20 00:00:00.000 PREV 2
015 1 2018-09-20 00:00:00.000 PREV 2
015 1 2018-09-20 00:00:00.000 TDAB 1
015 1 2018-09-20 00:00:00.000 TDAB 1
015 0 2018-09-20 00:00:00.000 TDAB 2
015 0 2018-09-20 00:00:00.000 TSPS 1
015 1 2018-09-20 00:00:00.000 TSPS 2
015 1 2018-09-20 00:00:00.000 TSPS 2
您僅從第一張表中選擇列。 毫無疑問,第二張表中有重復的匹配項。
因為您是在子查詢中計算rn
,所以您將獲得“第一”行以及多個匹配項。
我懷疑您的意圖可能更多是從第二張表返回一行(這只是一個猜測):
SELECT ghi.EMPLID, ghi.EMPL_RCD, ghi.EXAM_DT, ghi.IMMUN_CODE
FROM PS_GHS_HS_IMMUN ghi LEFT OUTER JOIN
(SELECT j.*,
ROW_NUMBER() OVER (PARTITION BY j.EMPLID, j.EMPL_RCD ORDER BY ?) as seqnum -- ? because I don't know which column
FROM PS_JOB j
)
ON ghi.EMPLID = j.EMPLID AND ghi.EMPL_RCD = j.EMPL_RCD AND j.seqnum = 1
GROUP BY ghiEMPLID, ghi.EXAM_DT, ghi.IMMUN_CODE, ghi.EMPL_RCD
ORDER BY ghi.EXAM_DT;
GROUP BY
對於此查詢不是必需的。 但是您正在構建的查詢可能需要它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.