我的一位朋友對我有這個問題,我感到太困惑了。基於標識符在2個區間之間隔離數據
他的團隊正在加載DW,並且數據在adhoc基礎上以遞增和滿載的方式進行。現在有一個標識符標誌 ,表示滿載何時開始或停止。現在我們需要收集並分離所有滿負荷。
對於離:
create table #tmp (
id int identity(1,1) not null,
name varchar(30) null,
val int null
)
insert into #tmp (name, val) select 'detroit', 3
insert into #tmp (name, val) select 'california', 9
insert into #tmp (name, val) select 'houston', 1
insert into #tmp (name, val) select 'los angeles', 4
insert into #tmp (name, val) select 'newyork', 8
insert into #tmp (name, val) select 'chicago', 1
insert into #tmp (name, val) select 'seattle', 9
insert into #tmp (name, val) select 'michigan', 6
insert into #tmp (name, val) select 'atlanta', 9
insert into #tmp (name, val) select 'philly', 6
insert into #tmp (name, val) select 'brooklyn', 8
drop table #tmp
規則是:
每當val爲9,全負荷啓動;每當val爲8時,全部的 加載停止; (或者當下一個val是8時,滿載停止)。
在這種情況下,對於全負載,我應該只收集這些記錄:
ID名稱VAL
3休斯敦1
4洛杉磯4
10費城6
我的方法到目前爲止:
;with mycte as (
select id, name, val, row_number() over (order by id) as rnkst
from #tmp
where val in (8,9))
SELECT *
FROM mycte y
WHERE val = 9
AND Exists (
SELECT *
FROM mycte x
WHERE x.id =
----> this gives start 9 record but not stop record of 8
(SELECT MIN(id)
FROM mycte z
WHERE z.id > y.id)
AND val = 8)
我不想冒險進入光標方式的光標,但用CTE,請指教!
UPDATE:
正如應答者,我重申了規則的人提到。
- >滿負荷記錄開始後即將9(第9條記錄不包括在內)
- >滿負荷持續到它看到眼前8.
- >所以,有效地9至8形式的所有記錄滿載的小塊
- >的個人第9個記錄本身沒有得到考慮,因爲它沒有8夥伴
- >下面顯示的結果集滿足這些條件
不應該密歇根也收集?亞特蘭大應該如何處理,因爲這是一個雙重的開始? – 2012-03-07 18:52:39
你有3個開始,但2個結束。你想如何處理? – JNK 2012-03-07 19:13:59
@justin ......現在的規則是,我們應該有一個8伴隨着9,形成一個起止點對。現在因爲亞特蘭大(9)記錄沒有其直接伴隨的伴侶,即6,所以不應該包括它。越多進出口。這裏的事情是捕獲所有這些對9-8中的記錄,而不是包括或不包括9條記錄,因爲如果需要的話,這些記錄可以容易地包含在只有val = 9的過濾器子句中。 – Ram 2012-03-07 19:16:35