【问题标题】:SQL select at least X rows that are in a given timeSQL 至少选择给定时间内的 X 行
【发布时间】:2009-11-07 11:39:14
【问题描述】:

我正在寻找一个 SQL 查询,它从表中准确地选择按日期排序的行。为此,有一列包含时间戳。

这里是棘手的部分: 它不应选择早于某个时间的行,但仍应选择至少 X 行。 因此,如果在给定时间内不超过 X 行,它应该将时间向后移动,直到它至少有 X 行。

谢谢!

【问题讨论】:

  • 它使用 SQL:1999 标准
  • 限制行集在数据库之间有很大不同,所以我们真的需要软件名称(mysql、oracle、sqlserver 等)
  • 它是 IBM DB2 的免费版本
  • SQL Server 时间戳数据类型与时间或日期无关。 SQL Server 时间戳是表示数据库中数据修改的相对顺序的二进制数。时间戳数据类型最初是为了支持 SQL Server 恢复算法而实现的。

标签: sql select


【解决方案1】:
SELECT DISTINCT * FROM 

    (SELECT TOP 100 *
    FROM MyTable
    ORDER BY dateColumn DESC) A

UNION

    (SELECT *
    FROM MyTable
    WHERE dateColumn > '20090101')

【讨论】:

  • +1 很棒的发现!这样做的一个副作用是它会删除重复的行
  • 如果你想要重复的原始重复行怎么办?无论如何还是很好的答案
  • UNION(相对于 UNION ALL)将删除重复的行,即使它们都来自查询的一侧
  • 如果 UNION 删除重复的行,即使与 @Andomar 所说的来自查询的同一侧,那么为什么需要 DISTINCT?
  • @Andy:这里不需要distinct,因为union 已经删除了重复的行
【解决方案2】:

我认为您可以通过按两列排序来实现这一点。排序列将是一个表达式,表示该行是否在指定的日期范围内。第二个排序列是日期本身

类似

select top x *
from the_table
order by 
    case when the_table.the_date between '1-jan-2009' and '31-jan-2009' then 0 else 1 end,
    the_table.the_date desc

【讨论】:

  • 据我了解,他不想限制返回的最大行数,所以这并不理想。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-06
相关资源
最近更新 更多