0

我正在尝试在图表上显示数据库中的一些记录。一分钟内保存的记录通常约为 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

其次,有没有更好的方法在(折线)图表中呈现大型数据集,而不是对记录进行分组?

4

2 回答 2

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)) ;
于 2015-07-27T02:20:08.313 回答
1

使用简单的 group byDATEPART而不用担心溢出。这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)
于 2015-07-27T03:16:20.180 回答