我有一个这种格式的表:
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,优先选择FieldC中的X(如果没有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
我猜我需要将该查询放在子查询中…
您可以这样使用ROW_NUMBER:
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'于所有其他记录的记录。
FieldA
FieldC = 'X'