【问题标题】:sql server select min value from matching datetimesql server 从匹配的日期时间中选择最小值
【发布时间】:2012-01-02 07:40:57
【问题描述】:
SELECT Id, Value, Sender, Recipient, MIN(DateTime), TypeOf, VideoId, Likes, Comments
FROM xx.dbo.StreamView
WHERE StreamView.TypeOf = 3 AND StreamView.[DateTime] >= "Some DateTime Value Here"

我正在尝试直接获取比给定 DateTime 值更新的最新记录。

执行此查询时,我收到以下错误:

Msg 207, Level 16, State 1, Line 1
Invalid column name 'Some DateTime Value Here'.

另外,当删除此行时AND StreamView.[DateTime] >= "Some DateTime Value Here"

我得到:

消息 8120,第 16 级,状态 1,第 1 行 列 'xx.dbo.StreamView.Id' 在选择列表中无效,因为它不包含在聚合函数或 GROUP BY 子句中。

建议?谢谢。

更新

WITH
  sequenced_records AS
(
  SELECT
    ROW_NUMBER() OVER (ORDER BY [DateTime] DESC) AS sequence_id,
    *
  FROM
    xx.dbo.StreamView
  WHERE
    StreamView.TypeOf = 3
    AND StreamView.[DateTime] >= "2011-12-29 01:38:21.607"
)
SELECT
  *
FROM
  sequenced_records
WHERE
  sequence_id = 1

returns -> Msg 207, Level 16, State 1, Line 11 列名“2011-12-29 01:38:21.607”无效。

更新 2

伙计们,我只需要在一组大于给定日期时间的选定项目中返回一条最短日期时间的单条记录。

【问题讨论】:

    标签: c# asp.net sql sql-server


    【解决方案1】:

    如果您要使用 MIN() 之类的聚合函数,则必须使用 GROUP BY 子句对非聚合列进行分组。

    http://msdn.microsoft.com/en-us/library/ms177673.aspx

    您还需要将"Some DateTime Value Here" 中的双引号替换为单引号。

    试试这个代码:

    SELECT 
        Id, 
        Value, 
        Sender, 
        Recipient, 
        MIN([DateTime]), 
        TypeOf, 
        VideoId, 
        Likes, 
        Comments
    FROM xx.dbo.StreamView
    
    WHERE StreamView.TypeOf = 3 AND StreamView.[DateTime] >= '1/1/2012'
    
    GROUP BY
        Id, 
        Value, 
        Sender, 
        Recipient, 
        TypeOf, 
        VideoId, 
        Likes, 
        Comments
    

    根据更新的问题:

    DECLARE @Date DATETIME = (
        SELECT MIN( [DateTime] ) FROM xx.dbo.StreamView WHERE TypeOf = 3 
            AND [DateTime] >= '1/1/2012' 
    );
    
    SELECT TOP 1 * FROM xx.dbo.StreamView WHERE [DateTime] >= @Date;
    

    【讨论】:

    • 为什么?我应该将其他所有内容分组吗?如果表有十亿列会怎样。
    • + 无效列的事情仍然给我同样的错误。 ://
    • 如果表有“十亿列”,数据库需要知道每一个列的聚合行为。它还能如何正确地对它们进行分组,以便您可以确定一列的最小值?
    • -1 :这个答案在功能上不是 OP 所描述的。它确实消除了错误,但没有提供所需的功能行为(指定日期之后的第一条记录)。
    • @Dems - 对我来说,这个问题并不清楚,如果 OP 想要在每个 Id/Sender/Recipient 组合的某个日期之后的单个记录还是整个数据集的单个记录。如果需要跨整个数据集的单个记录,那么您是正确的。
    【解决方案2】:

    MIN() 是一个聚合,正如错误所说;您必须使用 GROUP BY 才能使用聚合查询。这意味着您无法获取组的 MIN() 并且同时具有来自组中的一条记录的单个值。

    有两种选择...
    - 使用 GROUP BY 获取 MIN(),然后使用它来查找匹配的记录。
    - 使用替代方法,例如 ROW_NUMBER()

    WITH
      sequenced_records AS
    (
      SELECT
        ROW_NUMBER() OVER (ORDER BY [DateTime] ASC) AS sequence_id,
        *
      FROM
        xx.dbo.StreamView
      WHERE
        StreamView.TypeOf = 3
        AND StreamView.[DateTime] >= "Some DateTime Value Here"
    )
    SELECT
      *
    FROM
      sequenced_records
    WHERE
      sequence_id = 1
    

    注意你需要真正的日期时间,例如'01012012 23:34'


    对于没有 ROW_NUMBER() 的环境,您可以使用两个步骤恢复为聚合方法。比如……

    SELECT
      *
    FROM
      StreamView
    WHEREE
      TypeOf = 3
      AND DateTime = (SELECT MIN(DateTime) FROM StreamView WHERE TypeOf = 3 AND DateTime >= '01012012 23:34')
    

    【讨论】:

    • @user1027620 - 您在日期前后使用了错误的引号。使用'
    • @user1027620 - 另外,我应该有 ASC,而不是 DESC。对不起。
    • 感谢 Dems,您的解决方案完美运行,我想问一下,如果使用给定日期没有返回任何内容,那么查询将返回从该日期开始倒退的第一个项目?
    • @user1027620 - 作为一个 single 查询它是混乱和低效的。因此,当且仅当没有找到替代记录时,添加类似 IF (@@row_count = 0) <NewQuery> 的内容来查找前面的记录。
    【解决方案3】:

    您可以改用子查询:

    SELECT Id, Value, Sender, Recipient, DateTime, TypeOf, VideoId, Likes, Comments
    FROM xx.dbo.StreamView
    WHERE StreamView.TypeOf = 3 
    AND StreamView.[DateTime] = (Select MIN(DateTime) from xx.dbo.StreamView where [DateTime] >= 
    'Some DateTime Value Here' AND TypeOf = 3)
    

    【讨论】:

    • 必须在主查询和子查询中指定TypeOf = 3。否则 MIN(DateTime) 可能会为具有不同值 TypeOf 的记录返回一个值
    • 伙计们,我只需要在一组大于给定日期时间的选定项目中返回一条最短日期时间的单条记录。
    • @user1027620 - 如果多条记录被绑定为“下一个”,这将只返回多条记录。这与我回答中的第二个查询相同,应该可以正常工作。
    猜你喜欢
    • 2019-06-28
    • 2015-03-09
    • 1970-01-01
    • 2010-12-10
    • 2015-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-08
    相关资源
    最近更新 更多