Select 符合条件的组的第一行
Select first row of group with criteria
我有一个 table 这种格式:
FieldA FieldB FieldC
1111 ABC X
1111 DEF Y
1111 GHI X
2222 JKL Y
2222 MNO X
3333 PQR U
3333 STT U
我想 select 每个 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
:
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'
的记录优先于所有其他记录。
我有一个 table 这种格式:
FieldA FieldB FieldC
1111 ABC X
1111 DEF Y
1111 GHI X
2222 JKL Y
2222 MNO X
3333 PQR U
3333 STT U
我想 select 每个 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
:
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'
的记录优先于所有其他记录。