当前位置: 首页 > 面试题库 >

SQL-选择下一个日期查询

屈宏爽
2023-03-14
问题内容

我有一个表,其中包含许多ID和与每个ID相关联的许多日期,甚至还有一些没有日期的ID。对于每个ID和日期组合,我想选择ID,日期和也与该ID关联的下一个最大日期;如果不存在,则选择null作为下一个日期。

样品表:

ID      Date
1       5/1/10
1       6/1/10
1       7/1/10
2       6/15/10
3       8/15/10
3       8/15/10
4       4/1/10
4       4/15/10
4

所需的输出:

ID       Date       Next_Date
1        5/1/10     6/1/10
1        6/1/10     7/1/10
1        7/1/10     
2        6/15/10    
3        8/15/10    
3        8/15/10    
4        4/1/10     4/15/10
4        4/15/10

问题答案:

SELECT
mytable.id,
mytable.date,
(
SELECT
MIN(mytablemin.date)
FROM mytable AS mytablemin
WHERE mytablemin.date > mytable.date
AND mytable.id = mytablemin.id
) AS NextDate
FROM mytable


这已经在SQL Server 2008 R2上进行了测试(但是它应该可以在其他DBMS上使用),并产生以下输出:

id   Date   NextDate
----------- ----------------------- ---------------- -------
1 2010-05-01 00:00:00.000 2010-06-01 00:00:00.000
1 2010-06-01 00:00:00.000 2010-06-15 00:00:00.000
1 2010-07-01 00:00:00.000 2010-08-15 00:00:00.000
2 2010-06-15 00:00:00.000 2010-07-01 00:00:00.000
3 2010-08-15 00:00:00.000 null
3 2010-08-15 00:00:00.000 null
4 2010-04-01 00:00:00.000 2010-04-15 00:00:00.000
4 2010-04-15 00:00:00.000 2010-05-01 00:00:00.000
4 NULL NULL

更新1: 对于感兴趣的人,我比较了SQL Server 2008 R2中两个变体的性能(一个变体使用MIN聚合,另一个变体使用TOP 1和ORDER
BY):

在日期列上没有索引,MIN版本的成本为0.0187916,而TOP / ORDER BY版本的成本为0.115073,因此MIN版本是“更好”的。

使用date列上的索引,它们的表现相同。

请注意,这只是使用这9条记录进行的测试,因此结果可能是(非常)虚假的…

更新2: 结果保留10,000个均匀分布的随机记录。TOP / ORDER
BY查询花费了很长时间才能运行100,000条记录,因此我不得不取消它并放弃了。



 类似资料:
  • 问题内容: 我有一个和。我想获取这两个日期之间的日期列表。谁能帮助我指出查询中的错误。 这是一个变量。 问题答案: 您应该将这两个日期放在单引号之间,例如。 或可以使用 请记住,第一个日期是包含日期,但第二个日期是排除日期,因为它实际上是“ 2011/02/27 00:00:00”

  • 问题内容: 我想选择两个日期之间的记录- startDate和endDate(它们是sql中的日期/时间格式)。我有以下sql查询,但它不起作用,有人可以告诉我我在做什么错吗? 问题答案: 我建议将日期转换为日期时间并进行比较,并使日期保持标准和一致。就像是: 注意:我假设您的startDate和endDate与您提供的字符串具有相同的格式。

  • 我试图选择头衔、姓氏、出生日期和头衔为“销售代表”并且他们出生在1950年之前或之后的国家。 当a把日期放在代码中时,它会给我一个错误。 我认为这是正确的: 它给ORA-01843的错误:不是有效的月份 如果你能帮助我,谢谢你。 以下是表格的示例数据:

  • 问题内容: 我正在查询支持凭单数据库,并且每个凭单都有一个列“打开日期”和“关闭日期”。票证经常保持开放状态多天,因此我们需要能够拉出每天开放的票证数量。 例如,对于4/8/14,我们需要知道4/8上已打开多少张票,以及4/8之前已打开但在4的12:00 am仍未打开的未关闭票的总数/ 8(在4/8期间或之后可能已关闭,也可能未关闭)。 对于单个日期来说,这似乎足够简单,但是现在我需要编写一个查询

  • 问题内容: 我有一个数据库,如下所示; 我想做的是产生一个结果,该结果具有该日期最早()的每个客户的KWH读数,该日期将由用户以Web形式选择。 结果将/应该类似于; 这里显示的行数超过了每天,并且有更多的客户,并且客户数量会定期更改。 我在SQL方面没有太多经验,我研究过子查询等,但是我没有内容来弄清楚如何按最早阅读每个客户的方式来安排它,然后仅输出该列。 它在Redhat / CentOS上的

  • 问题内容: 如何从mysql表中选择过去日期到当前日期的数据?例如,选择从2009年1月1日到当前日期? 我的“ datetime”列为datetime日期类型。请帮忙,谢谢 编辑: 如果说我想从2009年1月1日开始获得每天的数据,该如何编写查询?使用计数和函数之间? 问题答案: 或使用和: