【问题标题】:Query to retrieve only the row with the biggest ID查询以仅检索具有最大 ID 的行
【发布时间】:2013-02-10 11:26:21
【问题描述】:

我想写一个查询,只返回每个 documentID 的 PeriodID 为 BIGGEST 的行,例如:

Table1: DOCUMENT
DocumentID  ItemName
-------------------------
1           Doc1
1           Doc1    
1           Doc1
2           Doc2
3           Doc3

Table2: DOC_PERIOD
PeriodID    StartDate   EndDate    DocumentID
----------------------------------------------------
20          1/1/2001    2/2/2002    1
30          2/1/2001    2/3/2012    1   
40          3/2/2012    8/5/2012    1   
25          3/2/2012    8/5/2012    2   
35          3/2/2012    8/5/2012    2   
45          3/2/2012    8/5/2012    3   

EXPECTED OUTPUT
DocumentID  ItemName    PeriodID    StartDate   EndDate
--------------------------------------------------------------------------
1           Doc1        40          3/2/2012    8/5/2012        
2           Doc2        35          3/2/2012    8/5/2012        
3           Doc3        45          3/2/2012    8/5/2012        


SELECT * FROM DOCUMENT
INNER JOIN DOC_PERIOD ON DOCUMENT.DocumentID = DOC_PERIOD.DocumentID
-- SCRIPT TO GET THE MAX PERIODID HERE

我的查询应该是什么样子?

【问题讨论】:

    标签: sql tsql greatest-n-per-group


    【解决方案1】:

    您没有指定您使用的 RDBMS,但如果您的数据库支持它,您可以使用 row_number() 获取结果:

    select DocumentId,
        ItemName,
        PeriodId,
        StartDate,
        EndDate
    from
    (
        select d.DocumentId,
            d.ItemName,
            dp.PeriodId,
            dp.StartDate,
            dp.EndDate,
            ROW_NUMBER() over(partition by d.documentid order by dp.periodid desc) rn
        from dbo.document d
        inner join dbo.doc_period dp
            on d.DocumentId = dp.DocumentId
    ) src
    where rn = 1
    

    【讨论】:

    • 事实上,尽管 SQL Server 比 Sybase 更容易假设,但他们甚至都没有指定它是否是 SQL Server。
    • @AndriyM 你是对的,我是根据tsql 标签做出的假设。我已更新我的答案以删除 SQL Server 评论。 :)
    • 标签上写着 tsql 所以它是 SQL Server。
    【解决方案2】:

    试试下面的查询...它会帮助你...

    SELECT ts.DocumentID,ts.ItemName,ts.PeriodID,tp.StartDate,tp.EndDate 
    FROM
    (SELECT DOCUMENT.DocumentID ,DOCUMENT.ItemName ,MAX(PeriodID) PeriodID 
    FROM DOCUMENT
    INNER JOIN 
    DOC_PERIOD ON 
    DOCUMENT.DocumentID = DOC_PERIOD.DocumentID
    group by DOCUMENT.DocumentID ,DOCUMENT.ItemName) ts
    
    INNER JOIN
    
    (SELECT DocumentID, Periodid,StartDate,EndDate from DOC_PERIOD) tp
    
    ON ts.periodId = tp.periodID
    

    【讨论】:

      猜你喜欢
      • 2018-12-14
      • 1970-01-01
      • 2019-11-30
      • 1970-01-01
      • 1970-01-01
      • 2019-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多