【问题标题】:Select X Most Recent Non-Consecutive Days Worth of Data选择 X 最近非连续天数的数据
【发布时间】:2010-09-23 10:42:03
【问题描述】:

有人对选择 x 个非连续天数的数据有任何见解吗?日期是标准的 sql 日期时间。例如,我想选择最近 5 天的数据,但记录之间可能有很多天的差距,所以只选择 5 天前和最近的记录是行不通的。

【问题讨论】:

  • 在我看来,要么是太早了,我还没有喝过咖啡,要么我需要更多信息来帮助你。日期是唯一的参数吗?你能返回它在这些日期找到的所有东西吗?

标签: sql sql-server sql-server-2005 datetime


【解决方案1】:

从性能的角度来看,这应该可以做到并且相当不错。您没有提到如何处理关系,因此如果需要,您可以添加 WITH TIES 子句。

SELECT TOP (@number_to_return)
     *   -- Write out your columns here
FROM
     dbo.MyTable
ORDER BY
     MyDateColumn DESC

【讨论】:

    【解决方案2】:

    按照Tony Andrews 建议的方法,这是在 T-SQL 中执行此操作的一种方法:

    SELECT
      Value,
      ValueDate
    FROM
      Data
    WHERE
      ValueDate >= 
      (
        SELECT 
          CONVERT(DATETIME, MIN(TruncatedDate))
        FROM 
          (
             SELECT DISTINCT TOP 5 
               CONVERT(VARCHAR, ValueDate, 102) TruncatedDate
             FROM 
               Event
             ORDER BY 
               TruncatedDate DESC
          ) d
      )
    ORDER BY
      ValueDate DESC
    

    【讨论】:

      【解决方案3】:

      我不知道 SQL Server 语法,但您需要:

      1) 按降序选择日期(时间部分被截断)

      2) 选出前 5 名

      3) 获取第 5 个值

      4) 选择日期时间 >= 第 5 个值的数据

      类似这样的“伪 SQL”:

      select *
      from data
      where datetime >=
      ( select top 1 date
        from
        ( select top 5 date from
          ( select truncated(datetime) as date
            from data
            order by truncated(datetime) desc
          )
          order by date
        )
      )
      

      【讨论】:

      • 我有一种不好的预感,这种机制最终会变得没有应有的效率。
      • 有一个用于截断日期的计算列,以及一个索引。然后选择 DISTINCT TOP 5 ORDER BY 应该很容易,您可以立即使用返回的值进行有效过滤。
      猜你喜欢
      • 2018-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-23
      • 2022-07-19
      • 1970-01-01
      • 2016-01-23
      • 2018-12-15
      相关资源
      最近更新 更多