2015-08-25 36 views
0

我想運行一個查詢,我必須使用當前行作爲透視排序。舉個例子:將函數內部的當前行值用作常量SQL

SELECT 
PERSONID, 
PERSONAGE AS CURRENTAGE, 
MAX(CASE WHEN (CURRENTAGE-PERSONAGE) >1 THEN PERSONAGE ELSE NULL END) 
    OVER (PARTITION BY PERSONCITY) AS OldestYounger 
FROM 
PERSON; 

我在想,如果這樣的事情是DB2或一般的任何數據庫可能的,我的情況要複雜得多。我沒有尋找一種解決方法,只是將當前行用作數據透視表的一種方式,然後通過通用屬性進行分區。

我知道在這個例子中,我可以只使用LAG()並按AGE訂購,或使用RANK()

編輯:

預期結果:

PersonID|CurrentAge|OldestYounger|City 
1  22   18   York 
2  25   22   York 
3  30   24   Jersey 
4  18   NULL   York 
5  24   NULL   Jersey 
6  7   NULL   Miami 

當是PersonID 2選擇它應該找到在同一個城市兩個弟弟的人,然後拿到MAX()值。但是在執行CurrentAge-PersonAge時,它是一樣的,並且總是返回零。我正在尋找一種方法使CurrentAge在該實例中保持不變,同時查看其他PersonAge的。

+0

你好夏普歡迎來到StackOverflow,請閱讀[**如何問**](http://stackoverflow.com/help/how-to-ask)和[**如何創建一個最小,完整和可驗證的例子。**](http://stackoverflow.com/help/mcve) –

+0

您是否希望將此行專門設置​​爲主鍵或具有類似屬性的主鍵?如果您不嘗試執行一對一的數據透視,則主鍵和外鍵是執行此操作的常用方法。 – Colin

+0

您可能想要顯示您的預期結果可能看起來像什麼,因爲您的解釋不是很有幫助。 – mustaccio

回答

0

你的意思是這樣嗎?

DECLARE @Age as int 

SET @Age = SELECT PERSONAGE FROM PERSON WHERE ID=2 

SELECT 
PERSONID, 
PERSONAGE AS CURRENTAGE, 
MAX(CASE WHEN (@Age-PERSONAGE) >1 THEN PERSONAGE ELSE NULL END) 
    OVER (PARTITION BY PERSONCITY) AS OldestYounger 
FROM 
PERSON 

這樣你就有一個用戶的年齡並與其他用戶比較。你現在的查詢是將每個用戶與自己進行比較,然後按城市排序。

+0

由於我相當確定OP是想爲_all_人獲得結果,所以使用這樣的主機變量可能無法(高效地)工作。我認爲使用'SELECT'會讓原來的問題混淆不清。 –