如何根据两个条件之一检索排名靠前的项目

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