【问题标题】:How do you select the value for the latest date? [duplicate]您如何选择最新日期的值? [复制]
【发布时间】:2021-01-31 00:58:28
【问题描述】:

我正在尝试简单地选择具有最新时间戳的值,但由于某种原因,我出现了某种大脑冻结。

下面的代码是选择所有记录:

SELECT S.idindicator, S.val ,[Time] = MAX(CAST(S.valTimestamp as date)), S.valTimestamp
FROM Status as S
WHERE S.INVALID = 0 
    AND S.id = 16888
GROUP by S.idindicator, S.val, S.valTimestamp 
ORDER BY S.valTimestamp DESC

我如何简单地选择具有最新日期的val,即 75.00?

注意:我已经使用相关子查询完成了它,但是,它将它变成了一个昂贵的查询。

【问题讨论】:

  • SELECT TOP 1 S.val FROM ...
  • 你不能使用 ORDER BY 因为SELECT TOP 1 FROM ( 会把它变成一个子查询,如果我没记错的话
  • @user3396351 你试过了吗?
  • 是的,我试过了,ORDER BY 不能在子查询中使用
  • SELECT TOP <n> 返回前 n 行。你只想要第一个?

标签: sql sql-server datetime sql-order-by greatest-n-per-group


【解决方案1】:

如果您只想要一行,请使用top (1)order by

select top (1) *
from status s
where invalid = 0 and id = 16888
order by valTimestamp desc

如果您想在多个ids 上获得相同的结果,那么一个选项使用窗口函数:

select *
from (
    select s.*, row_number() over(partition by id order by valTimestamp desc) rn
    from status s
    where invalid = 0
) s
where rn = 1

如果您想允许平局,那么您将在第一个查询中使用top (1) with ties,在第二个查询中使用rank() 而不是row_number()

【讨论】:

    【解决方案2】:

    您可能正在寻找简单的东西:

    SELECT TOP 1 S.idindicator, S.val , S.valTimestamp
    FROM Status as S
    WHERE S.INVALID = 0 AND S.id = 16888
    GROUP by S.idindicator, S.val, S.valTimestamp 
    ORDER BY S.valTimestamp DESC
    

    编辑:正如评论中指出的那样,t-sql 中不存在限制,请改用前 1

    【讨论】:

    • LIMIT 不是 T-SQL 运算符;它使用TOP
    猜你喜欢
    • 1970-01-01
    • 2022-01-20
    • 2015-09-08
    • 1970-01-01
    • 2022-07-22
    • 1970-01-01
    • 2015-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多