我開始考慮它,並想知道是否有一種方法來精簡它,並沒有臨時表。由於我最近所做的一切似乎都涉及CTE,所以我制定了一條解決方案。這是結果,它可能不是去了解它從一個CTE角度看,最有效的方式,但我更喜歡一堆臨時表和它的葉子最討厭的鑄造出來的最終SELECT
的:
;WITH CompanyDays
AS (
SELECT
Company
,MIN(ActualStartTime) AS StartDate
,MAX(endtime) AS EndDate
FROM Companies
WHERE finaljobstatus = '19' OR (finaljobstatus = '3' AND tasktypeid = '100')
GROUP BY Company
)
,StartFileSize
AS
(
SELECT
c.Company
,c.totaldatasizebytes AS StartFileSize
,cd.StartDate
,cd.EndDate
FROM Companies AS c
JOIN CompanyDays AS cd ON c.actualstarttime= cd.StartDate
WHERE (finaljobstatus = '19' OR (finaljobstatus = '3' AND tasktypeid = '100'))
)
,EndFileSize
AS
(
SELECT
c.Company
,CAST(s.StartFileSize AS DECIMAL(18,0)) AS StartFileSize
,CAST(c.totaldatasizebytes AS DECIMAL(18,0)) AS EndFileSize
,DATEDIFF(dd,cd.StartDate,cd.EndDate) AS DayDiff
,CAST(c.totaldatasizebytes AS DECIMAL(18,0)) - CAST(s.StartFileSize AS DECIMAL(18,0)) AS FileDiff
,cd.StartDate
,cd.EndDate
FROM Companies AS c
JOIN CompanyDays AS cd ON c.endtime= cd.EndDate
JOIN StartFileSize AS s ON c.Company = s.Company
WHERE (finaljobstatus = '19' OR (finaljobstatus = '3' AND tasktypeid = '100'))
)
SELECT
e.Company
,DayDiff
,FileDiff
,(FileDiff/e.StartFileSize)/DayDiff AS AveragePercentageChange
FROM EndFileSize AS e
請注意,DATEDIFF
在實際的開始和結束日期與時間可能略有偏差,因爲它只計算跨越的實際日邊界(即午夜)。在大多數情況下,這將會非常好。如果不是的話,你可以在幾小時內採取另一種措施,例如日期和時間,並將結果除以24;分鐘並將其除以1440;秒,並將其除以86400,具體取決於您需要的日間差異精確程度。
編輯:我意識到我的數學是關閉的。如果兩天之間出現下降,該怎麼辦?修正了這個問題,並將更多的演員轉移到了CTE中。
來源
2011-10-06 16:36:03
Wil
我們很樂意在[dba.se](http://dba.stackexchange.com/)上解答這些問題。 –
@Nick:這只是SQL。這不是你需要DBA才能回答的問題。 –
@Catcall - 我們歡迎所有SQL問題,尤其是非基礎問題。儘管我們的名字(我們中的一些人正在期待[更改](http://meta.dba.stackexchange.com/q/270/2660)),但我們只是回答任何一種嚴重的數據庫問題,而不僅僅是數據庫行政。 –