【问题标题】:Returning most recent row SQL Server返回最近的行 SQL Server
【发布时间】:2018-06-28 14:53:03
【问题描述】:

我有这张桌子

CREATE TABLE Test (
OrderID int,
Person varchar(10),
LastModified Date
);


INSERT INTO Test (OrderID, Person, LastModified)
VALUES (1,  'Sam', '2018-05-15'),
(1,  'Tim','2018-05-14'),
(1,  'Kim','2018-05-05'),
(1,  'Dave','2018-05-13'),
(1,  'James','2018-05-11'),
(1,  'Fred','2018-05-05');

选择 * 结果:

| OrderID | Person | LastModified |
|---------|--------|--------------|
|       1 |    Sam |   2018-05-15 |
|       1 |    Tim |   2018-05-14 |
|       1 |    Kim |   2018-05-05 |
|       1 |   Dave |   2018-05-13 |
|       1 |  James |   2018-05-11 |
|       1 |   Fred |   2018-05-05 |

我希望返回最近修改的行,即带有“Sam”的第一行。

现在我可以使用 max 返回最近的日期,但是如何聚合 person 列以返回 sam?

寻找类似的结果集

| OrderID | Person | LastModified |
|---------|--------|--------------|
|       1 |    Sam |   2018-05-15 |

我运行了这个:

SELECT 
OrderID,
max(Person) AS [Person],
max(LastModified) AS [LastModified]
FROM Test
GROUP BY 
OrderID

但这会返回:

| OrderID | Person | LastModified |
|---------|--------|--------------|
|       1 |    Tim |   2018-05-15 |

有人可以进一步建议我吗?谢谢

***更新

INSERT INTO Test (OrderID, Person, LastModified)
VALUES (1,  'Sam', '2018-05-15'),
(1,  'Tim','2018-05-14'),
(1,  'Kim','2018-05-05'),
(1,  'Dave','2018-05-13'),
(1,  'James','2018-05-11'),
(1,  'Fred','2018-05-05'),
(2,  'Dave','2018-05-13'),
(2,  'James','2018-05-11'),
(2,  'Fred','2018-05-05');

所以我会寻找这个结果是:

| OrderID | Person | LastModified |
|---------|--------|--------------|
|       1 |    Sam |   2018-05-15 |
|       2 |   Dave |   2018-05-13 |

【问题讨论】:

    标签: sql sql-server group-by


    【解决方案1】:

    如果您总是希望每个 OrderID 只记录一条记录(最新修改的一条),那么可以这样做:

    SELECT
          t2.OrderID
        , t2.Person
        , t2.LastModified
    
    FROM (
        SELECT
              MAX( LastModified ) AS LastModified
            , OrderID
    
        FROM 
            Test
    
        GROUP BY
            OrderID
    ) t
    
    INNER JOIN Test t2
        ON t2.LastModified = t.LastModified
        AND t2.OrderID = t.OrderID
    

    【讨论】:

    • 非常感谢,如果有多个 orderID,我有什么办法可以做到这一点,例如多人和 lastmodified 为多个 orderID 的?
    • 您能否用更多示例数据更新您的问题以涵盖这些情况?
    【解决方案2】:

    扩展您的评论(“非常感谢,如果有多个 orderID,例如多个人和 lastmodified 多个 orderID,我有办法做到这一点吗?”),在 xcvd 的回答中,我假设你想要的是这样的:

    WITH CTE AS(
        SELECT OrderId,
               Person,
               LastModifed,
               ROW_NUMBER() OVER (PARTITION BY OrderID ORDER BY LastModified DESC) AS RN
        FROM YourTable)
    SELECT OrderID,
           Person,
           LastModified
    FROM CTE
    WHERE RN = 1;
    

    【讨论】:

      【解决方案3】:

      只使用TOP (1)ORDER BY 怎么样?

      SELECT TOP (1) t.*
      FROM Test t
      ORDER BY LastModified DESC;
      

      如果你想为每个orderid 设置这个,那么这是 SQL Server 中的一个方便的方法:

      SELECT TOP (1) WITH TIES t.*
      FROM Test t
      ORDER BY ROW_NUMBER() OVER (PARTITION BY OrderId ORDER BY LastModified DESC);
      

      【讨论】:

      • 回归基本方法;)。为此 +1。
      【解决方案4】:

      “xcvd's”的答案非常适合这个,我只想添加另一个可以在这里使用的解决方案,以便向您展示一种可以在比这更复杂的情况下使用的方法。此解决方案使用嵌套查询(子查询)来查找 MAX(LastModified),而不考虑任何其他字段,并且它将使用原始查询的 WHERE 子句中的结果来查找符合新条件的任何结果。干杯。

      SELECT OrderID
          , Person
          , LastModified
      FROM Test
      WHERE LastModified IN (SELECT MAX(LastModified)
                             FROM Test)
      

      【讨论】:

        【解决方案5】:

        这是另一种方法:

        select t.*
        from Test t
        where LastModified = (select max(t1.LastModified) from Test t1 where t1.OrderID = t.OrderID);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-06-09
          • 2017-06-12
          • 2019-03-29
          • 2019-05-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多