2017-04-12 107 views
2

组的第一行我有一个表格式如下:选择与标准

FieldA FieldB FieldC 
1111  ABC  X 
1111  DEF  Y 
1111  GHI  X 
2222  JKL  Y 
2222  MNO  X 
3333  PQR  U 
3333  STT  U 

我要选择每FIELDA一个FieldB有偏好的X在FieldC(如果没有X,选择另外一个)。

我已经尝试使用RANK函数与PARTITION BY,但我觉得它太不一致了,我现在已经到达了一堵墙。

我的输出应该是这样的:

FieldA FieldB FieldC 
    1111  ABC  X 
    2222  MNO  X 
    3333  PQR  U 

查询:

Select 
rank() over (partition by Field3 order by Field1), 
Field,1 Field2, Field3 
FROM table 
ORDER BY Field1, Field3 

我猜我需要把一个子查询内部的查询......

+0

如果你有2个'X',你应该得到他们两个吗?如果没有,那么优先考虑哪些价值呢? –

+0

你可以发布你试过的查询吗? – Tricky12

回答

2

您可以使用这样的ROW_NUMBER

SELECT FieldA, FieldB, FieldC 
FROM (
    SELECT FieldA, FieldB, FieldC, 
      ROW_NUMBER() OVER (PARTITION BY FieldA 
          ORDER BY CASE 
             WHEN FieldC = 'X' THEN 1 
             ELSE 2 
             END, 
             FieldB) AS rn 
    FROM mytable) AS t 
WHERE t.rn = 1 

以上查询从每个FieldA分区中选择一条记录。它优先处理所有其他记录上有FieldC = 'X'的记录。

+0

绝对的辉煌! – nickfrenchy