我有一个特定股票的数据表,其中包含几年前的每笔交易。我想每天对这些数据进行分组,这样我就可以看到日常数量等等。
到目前为止,我提出的最佳方法是:
select
datepart(year, date),
datepart(month, date),
datepart(day, date),
sum(volume) from hi
group by
datepart(year, date),
datepart(month, date),
datepart(day, date)
order by
datepart(year, date),
datepart(month, date),
datepart(day, date)
我的SQL有点受限,所以我想知道是否有更有效的方法来做到这一点?
答案 0 :(得分:1)
SELECT DateAdd(dd, sub.DayCount, 0) as TheDate, SUM(sub.Volume)
FROM
(SELECT DateDiff(dd, 0, date) as DayCount, Volume FROM hi)
as Sub
GROUP BY Sub.DayCount
ORDER BY Sub.DayCount
就效率而言,两个查询都必须读取整个表一次。他们招致相同的IO。您应该使用SET STATISTICS IO ON
来清除IO,看看是否存在问题。
由于IO似乎是真正的问题,因此一个选项是创建一个包含Volume,DayCount(并且没有其他列)的索引。
答案 1 :(得分:1)
在SQL Server 2008及更高版本中,您可以使用date
类型。它仅包含datetime
的日期部分:
group by cast([date] as date)
或者对于早期版本:
group by convert(varchar(10), [date],121)
这将分组ODBC日期的前10个字符,或yyyy-mm-dd
。
答案 2 :(得分:0)
以下是您要找的内容
SELECT CONVERT(VARCHAR, hi.date,101), SUM(volume)
FROM hi
GROUP BY CONVERT(VARCHAR, hi.date,101)
答案 3 :(得分:0)
这是另一种方法:
http://www.sqlfiddle.com/#!3/25480/4
select
sum(volume) as totalPerDay,
simple_date
from
(
select
convert(varchar, [date], 101) as simple_date,
volume,
id
from hi
) tmp
group by
simple_date
完全披露:sqlfiddle.com是我的网站。