我有一张包含以下内容的表: 余额,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)
如何让两个查询更快,或至少第二个?
查询说明:
编辑:选中的答案为我提供了以下内容:
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
答案 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