如果值相等,SQL Max 将返回重复项

问题描述 投票:0回答:2

我有一个视图,其中包含文档 ID 列和日期列以及十几个与此问题无关的其他列。可以有多行具有相同的文档 ID,但日期通常不同。这意味着它是同一个文档,只是其修订版。问题是,如果我有两行文档 ID 和日期相同,我就会得到这两行。我只想得到一个。哪一个并不重要,只要我只得到一个即可。

以下内容重复,文档 ID 和日期相同。

SELECT FSD.*
FROM vFSD FSD
INNER JOIN
    (
    SELECT InternalID, MAX(FileLastUploadedDate) AS FileLastUploadedDate
    FROM vFSD
    GROUP BY InternalID
    ) gFSD ON FSD.InternalID = gFSD.InternalID AND FSD.FileLastUploadedDate = gFSD.FileLastUploadedDate

我也尝试过使用 DISTINCT,但没有解决问题。

SELECT DISTINCT FSD.*
FROM vFSD FSD
INNER JOIN
    (
    SELECT DISTINCT InternalID, MAX(FileLastUploadedDate) AS FileLastUploadedDate
    FROM vFSD
    GROUP BY InternalID
    ) gFSD ON FSD.InternalID = gFSD.InternalID AND FSD.FileLastUploadedDate = gFSD.FileLastUploadedDate
sql sql-server
2个回答
5
投票

如果两行与相同的最大

ROW_NUMBER
并列,则可以使用
FileLastUploadedDate
仅返回任意一行,以获得
InternalID

WITH CTE
     AS (SELECT *,
                ROW_NUMBER() OVER (PARTITION BY InternalID 
                                       ORDER BY FileLastUploadedDate DESC) AS RN
         FROM   vFSD)
SELECT InternalID,
       FileLastUploadedDate
       /*Other desired columns*/ 
FROM   CTE
WHERE  RN = 1 

0
投票

Martin 的好方法,了解 SQL CTE 中的WITH 如何处理临时表。集成到 Update 语句中是一个不错的选择

WITH  GetBestCSIforUTC
AS
(
Select TopX.utcID, TopX.TheOne
      , DetX.CSI , DetX.ExcsByCsiUtc, DetX.LstTExcsByCsiUtc
      , ROW_NUMBER() OVER ( PARTITION BY TopX.UTCid ORDER BY TopX.TheOne Desc ) AS RN
From (
        -- Selecting from many inner joins 
        -- The last one represented by TopX  and DetX sharing same Fields
  ) 

    UPDATE utcInv     -- target table, goal set the best CSI id for especific UTCid 
    Set utcInv.utcCSIDef = UMC.CSI
    From [dbo].[cbTUTCinventory] utcInv
    inner join (
                  Select utcID, TheOne
                        , CSI 
                  From GetBestCSIforUTC  -- Reference to my WITH Temp Table
                  WHERE rn = 1
    ) UMC on ( UMC.utcID = utcInv.UTCid )
© www.soinside.com 2019 - 2024. All rights reserved.