【问题标题】:SQL Server distinct select latest date onlySQL Server distinct 仅选择最新日期
【发布时间】:2018-05-11 20:44:17
【问题描述】:

所以我有一个独特的查询,可以将我的列表缩小到我所追求的范围内,但有时最后一个表可能有 3 个正确的选择,而我只想要最近出现的。

当前查询:

SELECT DISTCINT
    D.Filename, S.Name AS State, W.Name AS 'Workflow Name', U.Username AS 'Name', 
    CONVERT(VARCHAR, TH.Date, 101) AS [Entered State], 
    DATEDIFF(dd, TH.Date, GETUTCDATE()) AS [Days In State]
FROM
    Status AS S 
INNER JOIN
    Documents AS D ON D.CurrentStatusID = S.StatusID 
INNER JOIN
    Workflows AS W ON W.WorkflowID = S.WorkflowID 
INNER JOIN 
    TransitionHistory AS TH ON D.DocumentID = TH.DocumentID 
                            AND D.LatestRevisionNo - 1 = TH.RevNr 
INNER JOIN
    Users AS U ON U.UserID = TH.UserID
WHERE
    d.Filename NOT LIKE '%test%' 
    AND d.filename NOT LIKE '%^%' 
    AND S.Name IN ('Initiated', 'Design Review', 'Change Pending Approval',
                   'Under Editing', 'Waiting for Approval', 'Under Change',
                   'ECO Design Review', 'Minor Change no Revision',)
    AND W.Name IN ('Production')
ORDER BY
    Filename

例如,如果我选择一个特定文件(见图),您可以看到结果:

您可以在最后一个表中看到结果产生了 3 行符合条件,我正在尝试找到一种简单的方法让它匹配我的所有条件,然后只输出最高的 TransitionNr 或最新的日期。

我不是 SQL 人,我是从谷歌搜索中整理出来的 - 但我似乎找不到最后的部分。

感谢您的帮助。

【问题讨论】:

  • 请提供示例数据和预期结果 - 我怀疑您需要在此处进行分区并仅过滤顶部的一个
  • 如果你甚至不关心你可能使用的结果的分组..SELECT * FROM TransitionHistory WHEREDocumentID = 54666 andRevNr = 1 GROUP BY DocumentID ,或者在你的哪里添加其他条件来选择你想要的结果
  • 对不起,数据表都很大,我目前的输出超过10k行。该图像只是显示了一个特定查询的示例,我在使用 select distinct 时使用它来找出为什么我的结果包含重复项。
  • 您的图片似乎与查询无关...

标签: sql-server tsql date distinct


【解决方案1】:

一个快速的解决方案是:

SELECT D.Filename, S.Name AS STATE, W.Name AS 'Workflow Name', U.Username AS 'Name',
CONVERT(VARCHAR, MAX(TH.DATE), 101) AS [Entered State],
DATEDIFF(dd, MAX(TH.DATE), GETUTCDATE()) AS [Days In State]
FROM STATUS S
INNER JOIN Documents D ON D.CurrentStatusID = S.StatusID
INNER JOIN Workflows W ON W.WorkflowID = S.WorkflowID
INNER JOIN TransitionHistory TH ON (D.DocumentID = TH.DocumentID AND D.LatestRevisionNo - 1 = TH.RevNr)
INNER JOIN Users AS U ON U.UserID = TH.UserID
WHERE d.Filename NOT LIKE '%test%'
AND d.filename NOT LIKE '%^%'
AND S.Name IN ('Initiated', 'Design Review', 'Change Pending Approval', 'Under Editing', 'Waiting for Approval', 'Under Change', 'ECO Design Review', 'Minor Change no Revision')
AND W.Name IN ('Production')
GROUP BY D.Filename, S.Name, W.Name, U.Username

【讨论】:

  • kbbal 这产生了与我原来的结果非常相似的结果——我觉得这很奇怪,因为你使用了最大日期。我仍然得到重复,虽然没有那么多。我的原始查询产生了 10,490 行,而你的产生了 9,687 行。
  • 然而,原来是原始数据库设置的数据错误。 kbball 你明白了。
【解决方案2】:

尝试将查询中对TH.Date 的所有引用替换为MAX(TH.Date)

【讨论】:

  • 这给了我一个错误。我需要它来给我最近的 TH.Date,而不是 max
  • @demarcjp max date 应该给出最近的日期,因为它应该返回最大的值,这将是最近的日期
  • @kbbal 说得对。最后加上适当的 group by 语句。