2014-12-04 65 views
0

我需要基於沿相同代碼的深度間隔分組來生成彙總表。我嘗試了使用Minimum From_Depth和Meximum To_Depth的簡單group by子句,但它消除了重疊更改。下面是例子:如何避免重疊深度間隔範圍何時使用分組子句

Create Table #Lithology (
     Hole_ID varchar(10) 
    , mFrom int 
    , mTo int 
    , Strat varchar(10) 
    ,Strand varchar(10) 
) 

insert into #Lithology (Hole_ID, mFrom, mTo, Strat, Strand) values ('MD4803', 0, 2, 'CzD3', 'ALU'); 
insert into #Lithology (Hole_ID, mFrom, mTo, Strat, Strand) values ('MD4803', 2, 4, 'CzD3', 'ALU'); 
insert into #Lithology (Hole_ID, mFrom, mTo, Strat, Strand) values ('MD4803', 4, 6, 'CzD3', 'SCR'); 
insert into #Lithology (Hole_ID, mFrom, mTo, Strat, Strand) values ('MD4803', 6, 8, 'CzD3', 'SCR'); 
insert into #Lithology (Hole_ID, mFrom, mTo, Strat, Strand) values ('MD4803', 6, 8, 'CzD3', 'SCR'); 
insert into #Lithology (Hole_ID, mFrom, mTo, Strat, Strand) values ('MD4803', 8, 10, 'CzD2', 'CIDW'); 
insert into #Lithology (Hole_ID, mFrom, mTo, Strat, Strand) values ('MD4803', 10, 12, 'CzD2', 'CIDW'); 
insert into #Lithology (Hole_ID, mFrom, mTo, Strat, Strand) values ('MD4803', 12, 14, 'CzD2', 'CIDO'); 
insert into #Lithology (Hole_ID, mFrom, mTo, Strat, Strand) values ('MD4803', 14, 16, 'CzD2', 'CIDW'); 
insert into #Lithology (Hole_ID, mFrom, mTo, Strat, Strand) values ('MD4803', 16, 18, 'CzD2', 'CIDW'); 
insert into #Lithology (Hole_ID, mFrom, mTo, Strat, Strand) values ('MD4803', 18, 20, 'NAM', 'TNAM'); 
insert into #Lithology (Hole_ID, mFrom, mTo, Strat, Strand) values ('MD4803', 20, 22, 'NAM', 'TNAM'); 
insert into #Lithology (Hole_ID, mFrom, mTo, Strat, Strand) values ('MD4803', 22, 24, 'NAM', 'SNAM'); 
insert into #Lithology (Hole_ID, mFrom, mTo, Strat, Strand) values ('MD4803', 24, 26, 'NAM', 'SNAM'); 
insert into #Lithology (Hole_ID, mFrom, mTo, Strat, Strand) values ('MD4803', 26, 28, 'NAM', 'SONAM'); 
insert into #Lithology (Hole_ID, mFrom, mTo, Strat, Strand) values ('MD4803', 28, 30, 'NAM', 'SONAM'); 
insert into #Lithology (Hole_ID, mFrom, mTo, Strat, Strand) values ('MD4803', 30, 32, 'NAM', 'SNAM'); 
insert into #Lithology (Hole_ID, mFrom, mTo, Strat, Strand) values ('MD4803', 32, 34, 'NAM', 'SNAM'); 
insert into #Lithology (Hole_ID, mFrom, mTo, Strat, Strand) values ('MD4803', 34, 36, 'NAM', 'NNAM'); 
insert into #Lithology (Hole_ID, mFrom, mTo, Strat, Strand) values ('MD4803', 36, 38, 'NAM', 'NNAM'); 


select Hole_ID 
, min(mFrom) StartDepth 
, max(mTo) EndDepth 
, Strat, Strand 
from #Lithology 
group by Hole_ID, Strat, Strand 
order by MIN(mFrom) 

它返回以下結果,重疊的深度範圍。

Hole_ID StartDepth EndDepth Strat Strand 
MD4803 0   4   CzD3 ALU 
MD4803 4   8   CzD3 SCR 
MD4803 8   18   CzD2 CIDW 
MD4803 12   14   CzD2 CIDO 
MD4803 18   22    NAM TNAM 
MD4803 22   34   NAM SNAM 
MD4803 26   30   NAM SONAM 
MD4803 34   38   NAM NNAM 

預期的結果是,如下面沒有重疊的時間間隔:

Hole_ID StartDepth EndDepth Strat Strand 
MD4803 0   4   CzD3 ALU 
MD4803 4   8   CzD3 SCR 
MD4803 8   12   CzD2 CIDW 
MD4803 12   14   CzD2 CIDO 
MD4803 14   18   CzD2 CIDW 
MD4803 18   22   NAM TNAM 
MD4803 22   26   NAM SNAM 
MD4803 26   30   NAM SONAM 
MD4803 30   34   NAM SNAM 
MD4803 34   38   NAM NNAM 

任何建議,將不勝感激。 謝謝。

+0

請編輯你的問題標題和刪除連字符。 – 2014-12-04 08:11:50

回答

0

使用recusive CTE,以確定A組的解決方案:

;WITH lithCTE 
AS 
(
    -- number the rows for each hole id (in case any data in the sequence is missing) 
    SELECT * , 
    ROW_NUMBER() OVER (PARTITION BY Hole_Id ORDER BY mFrom 
         ) AS rn 
    FROM #Lithology 
) 
,retCTE 
AS 
(
    --starting from the top of each hole in the dataset, identify groups 
    SELECT Hole_Id, mFrom, mTo, Strat,Strand, rn, 1 AS grp 
    FROM lithCTE 
    WHERE rn = 1 

    UNION ALL 

    SELECT l.Hole_Id, l.mFrom, l.mTo, l.Strat,l.Strand, l.rn, 
    CASE WHEN r.Hole_Id = l.Hole_id 
      AND r.strat = l.strat 
      AND r.Strand = l.Strand 
      THEN r.grp ELSE r.grp + 1 END AS grp 
    FROM retCTE AS r 
    JOIN lithCTE AS l 
    ON l.hole_id = r.hole_id AND l.rn = r.rn + 1 
) 
SELECT Hole_ID 
, MIN(mFrom) StartDepth 
, MAX(mTo) EndDepth 
, Strat, Strand 
FROM retCTE 
GROUP BY Hole_ID, Strat, Strand,grp 
ORDER BY Hole_ID,StartDepth 

有可能是一個簡單的解決方案,但在目前它躲開我。

+0

嗨Ed, 感謝您的及時響應。它適用於單個孔。 我忘了提及我們有大約7000個孔,每個孔在實際表中的孔的平均孔深度(即孔中的25個層次)爲50米。分組將在每個洞內。 我設法解決了這個問題,如下所示。但我更喜歡你的解決方案。我的解決方案適用於小數據量。但整桌的速度很慢。根據您的解決方案,我會嘗試添加Hole_ID循環。 – 2014-12-05 01:43:09

+0

忘記在我之前的回覆中提供我的代碼。這is.Stplited到3步驟1是 ALTER VIEW Test_CTE_Litho_mFrom 作爲 用溫度爲( 選擇*,ROW_NUMBER()OVER(ORDER BY Hole_ID,mFrom,鏈)作爲ROWNUM 從tblDHLithology 其中Hole_ID像「MD6 %' ) 選擇Temp.Hole_id,Temp.mFrom,prev.Strand PreviousStrand,temp.Strand,Temp.rownum from temp LEFT JOIN Temp prev ON prev.rownum = Temp.rownum - 1 LEFT JOIN Temp nex ON nex .rownum = Temp.rownum + 1 其中temp.Strand <> prev.Strand或prev.Strand爲空 – 2014-12-05 01:51:19

+0

- 第2步創建視圖以檢索最高的mTo按Hole_ID,Strand和mTo組更改 更改視圖Test_CTE_Litho_mTo 作爲 與作爲的temp1(從tblDHLithology 選擇*,ROW_NUMBER()OVER(ORDER BY Hole_ID,mFrom,鏈)作爲ROWNUM 其中Hole_ID像 'MD6%' ) 選擇temp1.Hole_id,temp1.mTo,temp1目錄.trand,nex.Strand NextStrand,Temp1.rownum from temp1 LEFT JOIN temp1 prev ON prev.rownum = temp1.rownum - 1 LEFT JOIN temp1 nex ON nex.rownum = temp1.rownum + 1 其中temp1.Strand <> nex.Strand或nex.Strand爲空 – 2014-12-05 01:51:50