如何根据两个条件之一检索排名靠前的项目
how to retrieve top ranked item based on one of two criteria
我正在尝试提出一个查询,该查询将根据两个条件从 table 中为我提供一个地址行。每个客户可以有一个或多个地址行。
我的第一选择是处于特定状态的最旧的地址行
(客户按 AddressID 订购的前 1 行)纽约。
我的第二个选择是,如果客户在纽约没有地址
我想要该客户的地址列表中最早的地址 ID(无州标准)。
并非所有客户都在纽约州设有办事处。但如果他们有,我想要纽约最古老的地址。如果他们在纽约没有任何办事处,请给我地址 ID 最低的地址。如果他们有一些在纽约的地址,一些不在纽约,我想要最旧的纽约地址,但每个客户只有一行。
我一直在修补 RANK() = 1(一个 = NY,一个 <> NY)的两个 select 语句的 UNION,但不知道如何提出一行不求助于存储过程和几个 INSERT 语句(第二个语句可以排除已经在临时 table 中的客户,等等)。
如果有人知道如何做到这一点,我很乐意看到你的想法。
您可以使用带有条件 order by
子句的 window 函数。假设数据结构如下:
addresses
address_id
customer_id
state
您可以将查询阶段化为:
select *
from (
select a.*,
row_number() over(
partition by customer_id
order by case when state = 'NY' then 1 else 2 end, address_id
) rn
from addresses
) a
where rn = 1
我正在尝试提出一个查询,该查询将根据两个条件从 table 中为我提供一个地址行。每个客户可以有一个或多个地址行。
我的第一选择是处于特定状态的最旧的地址行 (客户按 AddressID 订购的前 1 行)纽约。
我的第二个选择是,如果客户在纽约没有地址 我想要该客户的地址列表中最早的地址 ID(无州标准)。
并非所有客户都在纽约州设有办事处。但如果他们有,我想要纽约最古老的地址。如果他们在纽约没有任何办事处,请给我地址 ID 最低的地址。如果他们有一些在纽约的地址,一些不在纽约,我想要最旧的纽约地址,但每个客户只有一行。
我一直在修补 RANK() = 1(一个 = NY,一个 <> NY)的两个 select 语句的 UNION,但不知道如何提出一行不求助于存储过程和几个 INSERT 语句(第二个语句可以排除已经在临时 table 中的客户,等等)。
如果有人知道如何做到这一点,我很乐意看到你的想法。
您可以使用带有条件 order by
子句的 window 函数。假设数据结构如下:
addresses
address_id
customer_id
state
您可以将查询阶段化为:
select *
from (
select a.*,
row_number() over(
partition by customer_id
order by case when state = 'NY' then 1 else 2 end, address_id
) rn
from addresses
) a
where rn = 1