SQL - 获取日期范围

时间:2016-05-12 08:57:58

标签: mysql sql

我有一张包含以下内容的表: 余额,Client_ID,日期

此表有大约2500万行 - 大多数天,服务执行并为每个客户创建一个新行,包括今天的日期和客户的余额。

在日期范围内,假设2016年1月1日至2016年5月12日,我需要获得第一行和最后一行。

*该服务并非每天都在运行,因此Date = 12/05/2016将无效。如果今天的余额等于昨天的余额,则没有插入行(节省了大约90%的数据,如果我正确计算,应该是3亿行)

为此,我运行以下两个查询: 获取第一个日期:6.9433851242065 seconds

SELECT * FROM (SELECT * FROM daily
            WHERE TIME >= '01/01/2016' AND TIME < '13/05/2016') dates
GROUP BY Client_ID

获取最后日期:32.034277915955 seconds

SELECT * FROM (SELECT * FROM daily
            WHERE TIME >= '01/01/2016' AND TIME < '13/05/2016'
            ORDER BY Date DESC) dates
GROUP BY Client_ID

第一个查询没有顺序,因为通过上面提到的服务总是以正确的顺序插入行 - 这样会快得多。 (7/32)

如何让两个查询更快,或至少第二个?

查询说明:

  • 获取日期为2016年1月1日之后的第一个日期的行
  • 获取日期为13/05/2016之前的最后日期的行

编辑:选中的答案为我提供了以下内容:

ASC和DESC是我的,“合并”是建议的答案

  • dates_ASC:33.300458192825

  • dates_DESC:8.9232740402222

  • dates_combined:8.4357199668884

  • dates_ASC:5.4825110435486

  • dates_DESC:10.173403978348

  • dates_combined:2.7024359703064

  • dates_ASC:15.090759038925
  • dates_DESC:29.375104904175
  • dates_combined:3.2885720729828

2 个答案:

答案 0 :(得分:1)

在派生表中选择每个客户端的最小和最大时间。加入该表:

select *
from daily d1
  join (select Client_ID, max(TIME) as maxtime, min(TIME) as mintime
        from daily
        WHERE TIME >= '01/01/2016' AND TIME < '13/05/2016'
        group by Client_ID) d2
 on d1.Client_ID = d2.Client_ID and d1.TIME in (d2.mintime, d2.maxtime)

答案 1 :(得分:0)

首先尝试查询:

SELECT * FROM daily WHERE TIME >= '01/01/2016' AND TIME < '13/05/2016' ORDER BY TIME ASC LIMIT 1

第二个查询为:

SELECT * FROM daily WHERE TIME >= '01/01/2016' AND TIME < '13/05/2016' ORDER BY TIME DESC LIMIT 1