2011-12-29 27 views
3

我有一個名爲crewWork表如下:如何追蹤一列的值改變了多少次?

CREATE TABLE crewWork( 
     FloorNumber int, AptNumber int, WorkType int, simTime int) 

被填充了表後,我需要知道多少次發生在容易改變多少次發生在地板上的變化。通常我希望在每個apt上找到10行,在每個樓層上找到40-50個行。 我可以爲此編寫一個標量函數,但我想知道是否有任何方法可以在t-SQL中執行此操作,而無需編寫標量函數。

感謝

的數據將是這樣的:

FloorNumber AptNumber WorkType  simTime 
1   1   12   10 
1   1   12   25 
1   1   13   35 
1   1   13   47 
1   2   12   52 
1   2   12   59 
1   2   13   68 
1   1   14   75 
1   4   12   79 
1   4   12   89 
1   4   13   92 
1   4   14   105 
1   3   12   115 
1   3   13   129 
1   3   14   138 
2   1   12   142 
2   1   12   150 
2   1   14   168 
2   1   14   171 
2   3   12   180 
2   3   13   190 
2   3   13   200 
2   3   14   205 
3   3   14   216 
3   4   12   228 
3   4   12   231 
3   4   14   249 
3   4   13   260 
3   1   12   280 
3   1   13   295 
2   1   14   315 
2   2   12   328 
2   2   14   346 

我需要一個報告中的信息,我並不需要存儲任何地方。

+0

您可以添加樣品數據,輸入和輸出嗎? – gbn 2011-12-29 09:59:55

+1

變化是如何表示的?作爲一個新的行? (如果你沒有把它存儲在某個地方不知道你期望標量函數如何幫助...) – 2011-12-29 10:00:26

+1

可能的重複[如何跟蹤列中發生的變化數量? T-SQL - SQL Server](http://stackoverflow.com/questions/2736934/how-to-track-number-of-changes-occured-in-a-column-t-sql-sql-server) – 2011-12-29 10:01:25

回答

5

如果我不缺什麼,您可以使用以下方法查找更改次數:

  • 確定隨後行的組相同的值;

  • 這些組數;

  • 減法1.

申請單獨爲AptNumberFloorNumber方法。

這些組可以像this answer一樣確定,只有在您的情況下沒有Seq列。相反,可以使用另一個ROW_NUMBER()表達式。這裏有一個近似解:

; 
WITH marked AS (
    SELECT 
    FloorGroup = ROW_NUMBER() OVER (      ORDER BY simTime) 
       - ROW_NUMBER() OVER (PARTITION BY FloorNumber ORDER BY simTime), 

    AptGroup = ROW_NUMBER() OVER (      ORDER BY simTime) 
       - ROW_NUMBER() OVER (PARTITION BY AptNumber ORDER BY simTime) 
    FROM crewWork 
) 
SELECT 
    FloorChanges = COUNT(DISTINCT FloorGroup) - 1, 
    AptChanges = COUNT(DISTINCT AprGroup) - 1 
FROM marked 

(我這裏假設simTime列定義變化的時間表。)


UPDATE

下面是示出了不同的組是如何用於AptNumber得到的表。

AptNumber RNRN_Apt Apt_Group (= RN - RN_Apt) 
--------- -- ------ --------- 
1   1 1  0 
1   2 2  0 
1   3 3  0 
1   4 4  0 
2   5 1  4 
2   6 2  4 
2   7 3  4 
1   8 5 => 3 
4   9 1  8 
4   10 2  8 
4   11 3  8 
4   12 4  8 
3   13 1  12 
3   14 2  12 
3   15 3  12 
1   16 6  10 
…   … …  … 

這裏RN是一個僞列,它代表ROW_NUMBER() OVER (ORDER BY simTime)。你可以看到,這僅僅是一個從1

另一個僞列開始的排名順序,RN_Apt包含的值由其他ROW_NUMBER,即ROW_NUMBER() OVER (PARTITION BY AptNumber ORDER BY simTime)產生。它包含具有相同AptNumber值的單個組內的排名。您可以看到,對於新遇到的值,序列重新開始,對於重複的序列,它會繼續上一次停止的位置。

您也可以從表中可以看到,如果我們減去RNRN_Apt(可能是倒過來,不會在這種情況下重要),我們得到一個唯一標識的每一個獨特的羣體價值相同的AptNumber值。您不妨將該值稱爲組ID。

所以,現在我們已經得到了這些ID,它只是對我們的計數(當然,計數不同的值)。這將是組的數量,並且更改的次數少一次(假設第一組不計爲更改)。

+0

例如,您能詳細說明如何獲得AptGroup嗎? – b3bel 2011-12-29 14:50:34

+0

AptGroup也應該考慮樓層,因爲#1樓的公寓#1不同於#2樓#1的公寓# – 2011-12-29 15:29:07

+0

@ b3bel:更新了我的回答。 – 2011-12-29 15:35:10

2

添加一個額外的列changecount

CREATE TABLE crewWork( 
     FloorNumber int, AptNumber int, WorkType int, simTime int ,changecount int) 

增量changecount值爲每個更新用

如果想知道計數的每個字段,然後添加與之對應列changecount

1

假設每個記錄代表不同的變化,您可以通過以下方式找到每層的更改:

select FloorNumber, count(*) 
from crewWork 
group by FloorNumber 

而且每間公寓的變化(假設AptNumber唯一標識公寓)由:

select AptNumber, count(*) 
from crewWork 
group by AptNumber 

或者通過(假設AptNumber和FloorNumber一起唯一標識公寓):

select FloorNumber, AptNumber, count(*) 
from crewWork 
group by FloorNumber, AptNumber