我正在尝试从图表上的数据库中显示一些记录。一分钟内保存的记录通常约为70条记录。这些记录在折线图上看起来很疯狂,但是当数据兴趣在四小时间隔之间时,期望用户继续请求每分钟查看记录会更加疯狂和不切实际。
我决定按分钟对记录进行分组,在那里我陷入了查询的困境。 以下是我的查询示例:
SELECT DISNTINCT YEAR(recievedon), MONTH(recievedon), DAY(recievedon), HOUR(recievedon), referenceprice
FROM dbname
WHERE recievedon >= '2015-06-05 10:30' AND recievedon <= '2015-06-05 10:50'
ORDER BY recievedon
如何使用GROUP BY
或DISTINCT
其次,有没有更好的方法在(线)图表中渲染大型数据集而不是对记录进行分组?
答案 0 :(得分:2)
如果我猜你使用的是MySQL,那么你可以使用to_seconds()
。以下给出了每分钟的平均参考价格,以及区间中第一个价格的日期/时间:
select min(recievedon), avg(referenceprice)
from dbname
where recievedon >= '2015-06-05 10:30' AND recievedon <= '2015-06-05 10:50'
group by floor(to_seconds(receivedon) / 60)
编辑:
在SQL Server中,您可以执行以下操作:
select min(receivedon), avg(referenceprice)
from dbname
where recievedon >= '2015-06-05 10:30' AND recievedon <= '2015-06-05 10:50'
group by datediff(minute, 0, receivedon);
如果您想要期间的开头而不是之前的时间戳:
select dateadd(minute, 0, datediff(minute, 0, receivedon)) as timeperiod,
avg(referenceprice)
from dbname
where recievedon >= '2015-06-05 10:30' AND recievedon <= '2015-06-05 10:50'
group by dateadd(minute, 0, datediff(minute, 0, receivedon)) ;
答案 1 :(得分:1)
使用DATEPART
之类的简单组,而不需要考虑溢出。 SELECT
与戈登的回答是一样的。
SELECT
MIN(ReceivedOn) AS Time,
-- Assuming you need average price
AVG(ReferencePrice) AS ReferencePrice
FROM
dbname
WHERE
ReceivedOn BETWEEN '2015-06-05 10:30' AND '2015-06-05 10:50'
GROUP BY
DATEPART(YEAR, ReceivedOn),
DATEPART(MONTH, ReceivedOn),
DATEPART(DAY, ReceivedOn),
DATEPART(HOUR, ReceivedOn),
DATEPART(MINUTE, ReceivedOn)