2015-10-06 152 views
1

結果我有如下所示的這個截圖SQL Server表:SQL查詢來獲取基於羣體

enter image description here

我如何查詢表得到包含靜態值,例如,一個附加列。 changeno change根據GROUPVALUE列?

在上述情況下,我需要no change作爲GROUP = 1作爲GROUP和VALUE兩者都是相同的值,但對於change GROUP = 2作爲在值列於第2組的值是不同的。

+1

您能畫出您的預期輸出嗎?如果可能的話提供SQLFiddle鏈接。 –

+1

你最後一段的內容太令人困惑了,請重新閱讀並再次嘗試。 – vol7ron

回答

1

這裏是一個應該包括你使用情況的查詢:

SELECT t1.GROUP, t1.ROW_NUM, t1.VALUE, t2.CHANGE 
FROM table t1 INNER JOIN 
(
    SELECT GROUP, 
     CASE WHEN COUNT(DISTINCT VALUE) = 1 THEN 'change' 
     ELSE 'no change' END AS CHANGE 
    FROM table 
    GROUP BY GROUP 
) t2 
ON t1.GROUP = t2.GROUP 

順便說一句,你可能會得到語法錯誤,因爲你以某種方式設法打電話給你列「集團」,這是最五味一個保留關鍵字的SQL。

+2

您可以使用方括號'[]'來處理保留關鍵字。 –

+0

我不想在最終的結果中對記錄進行分組......只需要爲每行顯示「更改」或「無變化」 – Rohaan

+0

@Rohaan我更新了我的查詢。你可以簡單地將我原來的答案加回到你的表中,以得到你想要的。 –

1
SELECT [GROUP], 
    ROW_NUM, 
    CASE 
     WHEN [GROUP]=1 AND CHANGE=VALUE THEN 'no change' 
     WHEN [GROUP]=2 AND CHANGE!=VALUE THEN 'change' 
     ELSE '' 
    END AS VALUE 
FROM table 
GROUP BY [GROUP] 

你的問題有點不清楚,因爲我一開始就認爲你想比較兩個字段。但是也許你試圖比較結果集中的兩個記錄;當前記錄爲前一個記錄,並且只有當兩個記錄之間的列沒有更改時才希望「不變」。

要比較記錄,可以使用窗口函數lag,它可以訪問窗口中前一行的值。請參看以下網頁上的說明:

適用於:SQL服務器2014的SQL Server 2016預覽

從前一行在相同的結果,而無需使用的訪問設置數據自加盟SQL Server 2016.LAG提供對位於當前行之前的給定物理偏移處的行的訪問。在SELECT語句中使用此分析函數可將當前行中的值與前一行中的值進行比較。

SELECT [GROUP], 
    ROW_NUM, 
    VALUE, 
    CASE 
     WHEN [GROUP] = LAG([GROUP],1,0) OVER(ORDER BY [GROUP],VALUE) 
      THEN CASE 
      WHEN VALUE = LAG(VALUE,1,0) OVER(ORDER BY [GROUP],VALUE) 
      THEN 'no change' 
      ELSE 'change' 
      END 
     ELSE '' 
    END AS CHANGE 
FROM table 
ORDER BY [GROUP], ROW_NUM