2015-11-20 76 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)'或类似的。 –