【问题标题】:SELECT 5 most recent SQL Server选择 5 个最新的 SQL Server
【发布时间】:2012-10-09 03:51:29
【问题描述】:

我有一张这样的记录表:

id        timestamp               dose             drug_id
1     2012-10-04 09:10:54          05                 2
1     2012-10-04 09:12:34          15                 2
1     2012-10-04 09:15:12          20                 2
1     2012-10-04 09:35:32          25                 2
1     2012-10-04 09:37:34          25                 2
1     2012-10-04 09:39:24          25                 2
1     2012-10-04 09:42:16          35                 2
1     2012-10-04 09:43:07          35                 2

我要做的是选择给定药物的最后 5 个使用剂量值,所以在这种情况下,查询应该返回 35, 25, 20, 15, 05

我知道我可以使用 TOP 和 ORDER BY 来获取最新的 5 个条目,但在这种情况下,它会返回重复项(35、35、25、25、25)。

我应该使用什么来获得我想要的输出?

【问题讨论】:

  • 对了,为什么25不在列表中?
  • @JohnWoo 同样的问题,因为你可以使用GROUP BY 然后,你不能得到你要求的结果..
  • 为什么不能按时间戳排序?

标签: sql sql-server tsql sql-server-2012


【解决方案1】:

我无权访问我的服务器来测试这个,但不应该

SELECT TOP 5 dose 
FROM table_id 
GROUP BY dose 
ORDER BY max(time) desc;

工作?

编辑:在http://sqlfiddle.com/#!6/610c4/2 上测试,请注意我没有使用timestamp 只是time。适当修复。

【讨论】:

  • 我今天休息,但会在早上第一件事尝试,谢谢
  • 酷酷。请注意,我在测试时对其进行了编辑,发现我之前的解决方案不起作用。这个应该。
【解决方案2】:
SELECT top 5 dose
FROM table_id
GROUP BY dose
ORDER BY max(timestamp) desc

【讨论】:

    【解决方案3】:

    这有帮助吗

    DECLARE @T TABLE(ID INT,Time_Stamp DATETIME,Dose INT, Drug_Id INT)
    INSERT INTO @T VALUES
    (1,'2012-10-04 09:10:54',05,2),
    (1,'2012-10-04 09:12:34', 15,2),
    (1,'2012-10-04 09:15:12',20,2),
    (1,'2012-10-04 09:35:32',25,2),
    (1,'2012-10-04 09:37:34',25,2),
    (1,'2012-10-04 09:39:24',25,2),
    (1,'2012-10-04 09:42:16',35,2),
    (1,'2012-10-04 09:43:07',35,2)
    
    
    ;WITH CTE AS(
    SELECT *, Rn = ROW_NUMBER()OVER(PARTITION BY Dose ORDER BY Time_Stamp DESC) 
    FROM @T)
    SELECT TOP 5 ID,Time_Stamp,Dose,Drug_Id 
    FROM CTE
    WHERE Rn = 1
    ORDER BY Dose DESC
    

    【讨论】:

      最近更新 更多