結果我有如下所示的這個截圖SQL Server表:SQL查詢來獲取基於羣體
我如何查詢表得到包含靜態值,例如,一個附加列。 change
和no change
根據GROUP
和VALUE
列?
在上述情況下,我需要no change
作爲GROUP
= 1作爲GROUP和VALUE兩者都是相同的值,但對於change
GROUP = 2作爲在值列於第2組的值是不同的。
結果我有如下所示的這個截圖SQL Server表:SQL查詢來獲取基於羣體
我如何查詢表得到包含靜態值,例如,一個附加列。 change
和no change
根據GROUP
和VALUE
列?
在上述情況下,我需要no change
作爲GROUP
= 1作爲GROUP和VALUE兩者都是相同的值,但對於change
GROUP = 2作爲在值列於第2組的值是不同的。
這裏是一個應該包括你使用情況的查詢:
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。
您可以使用方括號'[]'來處理保留關鍵字。 –
我不想在最終的結果中對記錄進行分組......只需要爲每行顯示「更改」或「無變化」 – Rohaan
@Rohaan我更新了我的查詢。你可以簡單地將我原來的答案加回到你的表中,以得到你想要的。 –
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
您能畫出您的預期輸出嗎?如果可能的話提供SQLFiddle鏈接。 –
你最後一段的內容太令人困惑了,請重新閱讀並再次嘗試。 – vol7ron