[英]SQL query: how can I get “id” of department in which employees receive the maximum salary?
[英]How to eliminate a row which having the maximum ID in sql query?
我需要從SQL查詢中消除具有最大ID的最后一行,該怎么辦? 我嘗試以下查詢。但是它沒有生成記錄
SELECT a.DocEntry, a.Project, a.DocTotal, a.U_Installement
FROM OPCH AS a
LEFT JOIN PCH1 AS b
ON b.DocEntry = a.DocEntry
LEFT JOIN OPOR AS c
ON c.DocEntry = b.BaseEntry
AND a.Project = c.Project
WHERE a.CANCELED = 'N'
AND a.Project = c.Project
GROUP BY a.DocEntry, a.Project, a.DocTotal, a.U_Installement
HAVING MAX(a.DocEntry) <> a.DocEntry;
看起來像這樣工作:
SELECT a.DocEntry, a.Project, a.DocTotal, a.U_Installement
FROM OPCH AS a
JOIN PCH1 AS b
ON b.DocEntry = a.DocEntry
JOIN OPOR AS c
ON c.DocEntry = b.BaseEntry
AND a.Project = c.Project
WHERE a.CANCELED = 'N'
AND a.DocEntry NOT IN (SELECT MAX(DocEntry) FROM OPCH)
在我看來,您想消除每個組的最大ID,因此我使用了row_number()
with cte as
(
SELECT a.DocEntry, a.Project, a.DocTotal, a.U_Installement,
row_number()over(partitioned by a.Project, a.DocTotal, a.U_Installement
ordere by a.DocEntry desc) rn
FROM OPCH AS a
JOIN PCH1 AS b
ON b.DocEntry = a.DocEntry
JOIN OPOR AS c
ON c.DocEntry = b.BaseEntry
AND a.Project = c.Project
WHERE a.CANCELED = 'N'
) select * from cte where rn<>1
首先,學習使用有意義的表別名而不是任意字母。 這使查詢更容易閱讀。
其次,您的WHERE
子句將外部聯接轉換為內部聯接。
然后,您將刪除重復項-但這些重復項可能是由JOIN
生成的。 這可以通過使用EXISTS
來解決。
因此,對於您的完整查詢:
SELECT o.DocEntry, o.Project, o.DocTotal, o.U_Installement
FROM OPCH o
WHERE o.CANCELED = 'N' AND
EXISTS (SELECT 1
FROM PCH1 p JOIN
OPOR op
ON op.DocEntry = p.BaseEntry
WHERE p.DocEntry = o.DocEntry AND
op.Project = o.Project
);
然后,您可以將窗口函數合並到其中:
SELECT DocEntry, Project, DocTotal, U_Installement
FROM (SELECT o.DocEntry, o.Project, o.DocTotal, o.U_Installement,
MAX(o.DocEntry) OVER () as max_DocEntry
FROM OPCH o
WHERE o.CANCELED = 'N' AND
EXISTS (SELECT 1
FROM PCH1 p JOIN
OPOR op
ON op.DocEntry = p.BaseEntry
WHERE p.DocEntry = o.DocEntry AND
op.Project = o.Project
)
) o
WHERE docEntry < max_docEntry;
我們定期使用此方法:
select a.* from (
SELECT a.DocEntry, a.Project, a.DocTotal, a.U_Installement
FROM OPCH a
GROUP BY a.DocEntry, a.Project, a.DocTotal, a.U_Installement
HAVING MAX(a.DocEntry) <> a.DocEntry
) AS a
LEFT JOIN PCH1 AS b
ON b.DocEntry = a.DocEntry
LEFT JOIN OPOR AS c
ON c.DocEntry = b.BaseEntry
AND a.Project = c.Project
WHERE a.CANCELED = 'N'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.