簡體   English   中英

選擇具有另一列最大值的不同行

[英]Select distinct rows with max value of another column

我正在查詢文檔管理數據庫,其中文檔可以有多個版本。 因此,由於版本控制,我下面的查詢多次返回相同的文檔。

 SELECT distinct d.DOCNUM, d.DOCNAME,P.FolderName
    FROM DOCUMENT as d with (nolock)
    inner join Project_T as pt on d.docnum=pt.item_id
    inner join Projects p on pt.prj_id=p.prj_id
   where d.type = 'Personal' and d.owner like '%67360'

結果:

DOCNUM     | DOCNAME     | FOLDERNAME |
-----------+----------+---------------+
123         Article        Jonathan
123         Article part1  Jonathan
256         Meeting Notes  Jonathan
5697        Memo           Jonathan

理想情況下 docnum 123 應該只返回一次。

我加入了保存每個文檔版本的表,並選擇了最新版本(MAX(h.version)因此我的查詢應該每行返回唯一的文檔編號。

    SELECT distinct d.DOCNUM, h.version, d.DOCNAME,P.FolderName
    FROM DOCUMENT as d with (nolock)
    inner join DOCHISTORY as h on h.DOCNUM = d.docnum
    inner join Project_T as pt on d.docnum=pt.item_id
    inner join Projects p on pt.prj_id=p.prj_id
   where d.type = 'Personal' and d.owner like '%67360'
   and d.SECURITY = 'P'
   AND h.VERSION = (SELECT MAX(x.version) FROM DOCHISTORY as X 
                    where x.docnum = d.DOCNUM) 

但是這次我得到了最新版本,其中 docname 略有不同,它多次返回相同的 docnum。 請參閱下面的文檔 123。

DOCNUM     | Version      | DOCNAME     | FOLDERNAME |
-----------+--------------+-------------+------------+
123          9              Article        Jonathan
123          9              Article part1  Jonathan
256          1              Meeting Notes  Jonathan
5697         21             Memo           Jonathan

我需要在我的報告中顯示 docname 列。 請問這個有辦法嗎?

是的,您可以選擇前 1 個文檔名。 將您的字段選擇列表替換為:

SELECT distinct d.DOCNUM
 ,h.version 
 ,DOCNAME = (SELECT TOP 1 d2.DOCNAME FROM DOCUMENT d2, DOCHISTORY h2 
 WHERE d2.DOCNUM = d.DOCNUM and h2.DOCNUM = d.docnum)
 ,P.FolderName

....(其余代碼)

在上面的輸出中,doc 123 version 9 應該顯示為 Article。

使用窗口函數,您要做的事情要容易得多。 這是一種方法:

select DOCNUM, version, DOCNAME, FolderName
from (SELECT d.DOCNUM, h.version, d.DOCNAME, P.FolderName,
             max(h.version) over (partition by d.docnum) as maxversion
      FROM DOCUMENT  d with (nolock)
           inner join DOCHISTORY as h on h.DOCNUM = d.docnum
           inner join Project_T as pt on d.docnum=pt.item_id
           inner join Projects p on pt.prj_id=p.prj_id
     where d.type = 'Personal' and d.owner like '%67360' and d.SECURITY = 'P'
    ) d
where version = maxversion;

表達式max(h.version) over (partition by d.docnum)是一種稱為窗口函數(或某些數據庫中的分析函數max(h.version) over (partition by d.docnum)的構造。 所做的是為h.version的每個值返回h.versiond.docnum (基於partition by子句)。 這是 ANSI 標准 SQL,大多數數據庫都支持此功能。

您的版本可能無法正常工作,因為計算最大值的子查詢未使用與外部查詢相同的過濾條件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM