2016-05-23 37 views
-1

我有一個數據集,看起來像這樣如何計算SQL Server中一列有特定值的連續行?

gId mId 
226 88825 
226 88825 
226 88825 
226 88825 
226 88825 
226 88825 
226 88832 
226 88832 
226 88832 
226 88832 
226 88863 
226 88863 
226 88863 
226 88863 
226 88863 
227 89080 
227 89080 
227 89080 
227 89148 
227 89148 
227 89148 
227 89197 
227 89197 
227 89197 
227 89148 
227 89197 
227 89197 
227 89197 
227 89197 
227 89148 
227 89197 
227 89197 
227 89197 
227 89197 
227 89148 
227 89197 
227 89197 
227 89197 
229 89267 
229 89318 
229 89322 
231 90257 
231 90340 
231 90350 
247 94318 
247 94318 
249 94642 
249 94642 
249 94642 
249 94400 
249 94642  
249 94642 
249 94642 
249 94642 
249 94642 
249 94642 
249 94400 
249 94400 
249 94400 
249 94400 

我需要能夠獲得獨特gId的列,其中mId列包含在連續5個或更多行具有相同值的列表。所以上面的數據集將返回這樣

gId mId 
226 88825 
226 88863 
249 94642 

一個重要的事情的東西一提的是,我不能改變這個列表的順序,所以我必須頂算它底部能夠檢查連續行。

我的表看起來像這樣

CREATE TABLE t (
    gId int NOT NULL, 
    mId int NOT NULL 
); 
+4

SQL表代表*無序*表。沒有導電行的概念,除非另一列指定了排序。 –

+0

我們是否應該假設'_conservative_ rows'的意思是'_consecutive_ rows'? – PinnyM

+0

連續是我打算輸入的內容。我對這個錯字感到抱歉。我剛剛更新了我的問題 –

回答

2

如果您正在使用一個版本的SQL Server支持公共表表達式,這應該做的伎倆:

WITH AtLeastFive AS (
    SELECT gId, mId, ROW_NUMBER() OVER (PARTITION BY gId, mId ORDER BY gId, mId) AS RowNum 
    FROM t 
) 
SELECT * FROM AtLeastFive WHERE RowNum =5 
+0

當然,如果連續的因素依賴於別的東西,比如行的物理順序,則必須替換ROW_NUMBER函數中的某些確定列......就像CreateDate列。 – Shoeless

+0

謝謝。這似乎是給出了正確的數據集 –

+1

不客氣。重要的是要明白,如果沒有適當的ORDER BY,就不能保證數據的排序(如@Tab Alleman在他對你的問題的評論中所述)。假如gId可能在物理上失序,但是用ORDER BY邏輯理順,那麼你的狀態會很好:) – Shoeless

相關問題