我有一个大数据可供选择。数据是按小时计算的。在一天中将有24条记录,因此在一个月内将是24 * 30 = 720条记录。这只适用于一组,我在表中有3组。比方说,A组,B组和C组。所以一个月的总数将是720 * 3 = 2,160条记录 这些数据自2008年以来一直在运行。
目前,我必须计算该表中某个字段的总和。现在让我们说表名是'oTable'。我有以下t-sql:
;WITH ff AS (
SELECT GroupCode,
DateAdd(hh,-1,DateAdd(hh,DatePart(hh,myTime),myDate)) AS newDate, Value
FROM oTable
)
SELECT GroupCode, CAST(newDate AS DATE) AS MainDate, SUM(Value)
FROM ff
GROUP BY GroupCode, CAST(newDate AS DATE)
它将计算第二天01:00:00到00:00:00的值。这将是每日基础数据。
为了防止加载大量数据,我正在使用这个t-sql:
--=========================================
DECLARE @date DATE;
DECLARE @MonthID int = 3;
DECLARE @Year int = 2014;
SELECT @date = Cast (CONVERT(VARCHAR(4), @Year) + '-' + CONVERT(VARCHAR(2), @MonthID) + '-01' AS DATE)
SELECT GroupCode, myDate, myTime, Value
INTO #TempTable
FROM oTable
WHERE myDate BETWEEN Dateadd(day, -1, @date) AND Dateadd(day, 1, Dateadd(day, -Day(@date), Dateadd(month, 1, @date)))
;WITH ff AS (
SELECT GroupCode,
DateAdd(hh,-1,DateAdd(hh,DatePart(hh,myTime),myDate)) AS newDate, Value
FROM #TempTable
)
SELECT GroupCode, CAST(newDate AS DATE) AS MainDate, SUM(Value)
FROM ff
GROUP BY GroupCode, CAST(newDate AS DATE)
--========================================
我的问题是,我想从参数中计算从年初开始的'值'的总和。比方说,参数是@monthid ='3'和@year ='2014'......我需要知道从2014年1月1日到2014年3月的总价值。
有谁知道怎么做?如果我没有使用上面的脚本(为了防止加载大量数据),这很容易,但速度极慢。
谢谢。
答案 0 :(得分:1)
DECLARE @date1 DATE;
DECLARE @date2 DATE;
DECLARE @MonthID int = 3;
DECLARE @Year int = 2014;
SELECT @date1=DATEADD(DAY,-1,DATEADD(MONTH,1,CAST(CAST(@MonthID AS VARCHAR)+'/01/'+CAST(@Year AS VARCHAR)AS DATE)))
SELECT @date2=CAST('01/01/'+CAST(@Year AS VARCHAR)AS DATE)
SELECT @date1,@date2
SELECT SUBSTRING(CONVERT(VARCHAR,myDate,113),4,8) MonthYear,GroupCode,SUM(Value)
FROM oTable
WHERE myDate BETWEEN @Date2 AND @Date1
GROUP BY SUBSTRING(CONVERT(VARCHAR,myDate,113),4,8),GroupCode
答案 1 :(得分:0)
您的表在日期字段中是否有聚集索引?这些数据是递增的,因此它将是一个很好的候选者。这应该真正提高您的查询性能。
你可以修改表格吗?尝试添加持久计算列来表示月/年(Convert date to YYYYMM format),在其上放置索引,然后在查询中使用它。