2011-05-13 78 views
2

我試圖找到一個更好的方式來做一個水晶報告(別人的)...在組中加起來不重疊的時間。 這顯然是一個古老的問題... 有越來越的技術隨着時間的推移而增長(不重疊) - 技術?

  • 調整(開始/結束)時間,每次記錄,在子組內去除常見/過單圈時間,
  • --using直接的SQL(雖然我覺得我可以做的CTE)

的開始時間假設初始訂單的(和/或集團,亞組),並開始和結束是不同的領域。

一個樣 - 圖形例如:

Group 1 
    SubGroup A 
    Tkt 1 |--start&end---|      "16" 
    Tkt 2  |----tart&end----|    "18" 
    Tkt 3   |--art&end---|     "14" 
    Tkt 4       |--S & E -| "11" 

    SubGroup B 
    Tkt 5 |-S&E-|         "7" 
    Tkt 6   |-S&E-|       "7" 
    Tkt 7   |-S&E-|      "7" 
    ... 

(equiv adjusted start/end w/in sub-group): 
Group 1 
    SubGroup A       ( w/ "elapsed time" of "33" ) 
    Tkt 1 |--start&end---|   <- Regular    "16" 
    Tkt 2     |-----| <- Adjusted "start"  "6" 
    Tkt 3       | <- Adjusted "start" & "end" "0" 
    Tkt 4       |--S & E -| <- Regular "11" 

    SubGroup B       (w/ "elapsed time" of "17" ) 
    Tkt 5 |-S&E-|     <- Regular    "7" 
    Tkt 6   |-S&E-|   <- Regular (no overlap) "7" 
    Tkt 7    |-|   <- Adjusted "Start"  "3" 
    ... 

我說的不是在這一點上獲得的款項,只是表示基於以前的記錄調整的開始/結束。

在報告中,他們針對每個記錄執行多個公式,針對組中第一條記錄中設置的兩個變量,然後根據當前記錄設置/更新AdjustedStart,AdjustedEnd的值並將AdjustedStart,AdjustedEnd到另一個公式來計算時間差,待以後再總結。目前的技術很慢,我不能做一個漂亮的交叉表,是理想的。

我想/希望這在SQL-只得到解決,因爲我們不能把任何PROC的,臨時表等數據庫服務器上。我試圖找出一種方法瓦特/ CTE和(重新)詛咒,使用Group/SubGroup作爲親子鑑定和CASE來比較當前值w /最後父母值。這是否會響起鈴聲或聽起來似乎合理?

水晶的能力很多,但這似乎是一個它不被剪掉的能力。

馬克

回答

0

我這樣做了我的頭頂部...

SELECT 
    CUR.subgroup, 
    CUR.ticket, 
    COALESCE(MAX(PARENT.end_time), CUR.start_time) AS start_time, 
    CASE 
     WHEN CUR.end_time < MAX(PARENT.end_time) THEN MAX(PARENT.end_time) 
     ELSE CUR.end_time 
    END 
FROM 
    My_Table CUR 
LEFT OUTER JOIN My_Table PARENT ON 
    PARENT.start_time <= CUR.start_time AND 
    PARENT.end_time > CUR.start_time AND 
    PARENT.ticket <> CUR.ticket AND 
    PARENT.subgroup = CUR.subgroup 
GROUP BY 
    CUR.subgroup, 
    CUR.ticket, 
    CUR.start_time, 
    CUR.end_time 
+0

我想編碼,我/我的領域。沒有太多的運氣,但我會繼續堵塞。這就是我所做的; ;-) – Marc 2011-05-17 23:10:08

+0

我找到了一個tome的參考,「在SQL中開發面向時間的數據庫應用程序」(但是,不,我找不到這個LINK)。第4章是關於時期和集合的操作,但我還沒有破解過任何可用的東西。下面是「谷歌是你的朋友」的結果:http://www.cs.arizona.edu/~rts/publications.html [乞討的問題是「谷歌真的是一個好朋友?」] – Marc 2011-05-18 14:29:13

0

我很欣賞你在很久以前問過這個問題,但它讓我感興趣的,所以我做了一些研究並找到Jeff Moden的解決方案;他寫了一篇關於將日期島分組的文章,您可以在這裏找到:Group Islands of Contiguous Dates(需要登錄,但免費註冊)。

我假設你在一個子組中每天都有一個表,所以「Tkt1」有16行,「Tkt2」有18行。如果情況並非如此,你只有開始和每個「Tkt」的結束日期,您將不得不使用Calendar表來推斷每個範圍的行。

傑夫的解決方案使用ROW_NUMBERDATEDIFF招日期組島嶼。

WITH Grouped_Dates AS 
(-- Find the unique dates and assign them to a group. 
    -- The group looks like a date but the date means nothing except that adjacent 
    -- dates will be a part of the same group. 
SELECT group_name, 
     unique_date = tkt_date, 
     date_group = DATEADD(dd, -ROW_NUMBER() OVER (PARTITION BY group_name ORDER BY group_name, tkt_date), tkt_date) 
    FROM t 
    GROUP BY group_name, tkt_date 
) 
-- Now, if we find the MIN and MAX date for each date_group, we'll have the 
-- Start and End dates of each group of contiguous daes. While we're at it, 
-- we can also figure out how many days are in each range of days. 
SELECT group_name, 
     start_date = MIN(unique_date), 
     end_date = MAX(unique_date), 
     days  = DATEDIFF(dd,MIN(unique_date),MAX(unique_date))+1 
FROM Grouped_Dates 
GROUP BY group_name, date_group 
ORDER BY group_name, start_date 

該查詢的結果是

 
group_name start_date end_date days 
---------- ---------- ---------- ---- 
Group1  2012-01-01 2012-01-22 22 
Group1  2012-01-24 2012-02-03 11 
Group2  2012-01-09 2012-01-15  7 
Group2  2012-01-18 2012-01-27 10 

我創建了一個SQL Fiddle根據您的問題樣本數據。

然後,您可以對每個組進行求和以給出花費的總時間。

+0

這是相當適時......我一直在研究其他幾個項目,而這個項目一直在盯着我(以及那些想要完整報告的人)。我帶來了很多額外的領域,我認爲我的問題的一部分是在處理數百到數千條記錄的同時努力保持深度的分組 - 處理太多的領域。我將嘗試重新使用這種技術,並看看我能否以2200(一個數字中的一個)跳到我用另一種方法獲得的84000個記錄擴展。 – Marc 2013-01-24 02:14:28

相關問題