有效的方法来每天分组第二个数据?

时间:2012-01-29 19:34:10

标签: sql sql-server

我有一个特定股票的数据表,其中包含几年前的每笔交易。我想每天对这些数据进行分组,这样我就可以看到日常数量等等。

到目前为止,我提出的最佳方法是:

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有点受限,所以我想知道是否有更有效的方法来做到这一点?

4 个答案:

答案 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是我的网站。