2015-11-20 85 views
0

尋找一個SQL解決下面的問題SQL服務器:有多個標準

返回USERNUMBER組合WHERE PRIORITY = MIN(PRIORITY) [NULL相當於MAX(PRIORITY + 1)] ...在領帶的情況下PRIORITY選擇值,打破使用最低LINEITEM

字段:

USER, 
LINEITEM, 
NUMBER, 
PRIORITY 

值:( 'X' 表示期望的組合)

USER LINEITEM NUMBER PRIORITY  
------------------------------------- 
1  1   12345 NULL  
1  2   23456 2 
1  3   34567 1   X 
2  1   9876 3 
2  2   98765 1   X 
2  3   12345 2 
2  4   23456 1 
3  1   23456 NULL  X 
3  2   12345 NULL  
4  1   34567 NULL  
4  2   45678 NULL  
4  3   12345 1   X 
4  4   12345 2 
4  5   23456 1 

預先感謝。

針對PM 77-1,

我目前的方法:

SELECT table1.user,table1.number 
FROM table1 
JOIN (
    SELECT user, 
    CAST(MIN((COALESCE(priority,999) * 
    (10^(5 - LEN(COALESCE(CAST(priority AS VARCHAR),'999'))))) + 
    lineitem) AS VARCHAR) AS selector 
    FROM table1 GROUP BY user 
) AS table2 
    ON table1.user = table2.user 
    AND table1.lineitem = CAST(RIGHT(table2.selector, 1) AS int) 
    ORDER BY table1.user; 
+0

確定。什麼阻止你創建這樣的查詢?你卡在哪裏? –

+0

我試圖用SELF-JOIN和NOT EXISTS執行任務,但一直得到不準確的結果。 我目前的解決方案是非常不雅,我想了解如何使用集合操作來完成它。 –

+0

請使用[編輯]將您的代碼添加到您的問題中。 –

回答

1

使用ROW_NUMBER

SQL Fiddle

;WITH Cte AS(
    SELECT *, 
     ROW_NUMBER() OVER(
      PARTITION BY [User] 
      ORDER BY 
       CASE WHEN Priority IS NULL THEN 1 ELSE 0 END, 
       Priority, 
       LineItem 
     ) AS rn 
    FROM tbl 
) 
SELECT 
    [User], LineItem, Number, Priority 
FROM Cte 
WHERE rn = 1 
+1

如果優先級是可預測的低數字,那麼可以簡化爲'ISNULL(優先級,99)'或類似的。 –