SQL 通过使用 max over partition by 比较一列,然后比较另一列

SQL compare one column, then another, by using max over partition by

数据库:SAP HANA

我以前问过这个问题,但现在我面临更复杂的问题。当qty一样的时候,我要return最大no.

一个

user no qty
A 10 20
A 11 20
B 12 40
B 13 10

B

id user
1 A
2 B

预期结果

id user no
1 A 11
2 B 12

我试试

SELECT
    B.id,
    B.user,
    C.max_qty_no
FROM
    B
LEFT JOIN (
    SELECT 
        A.user,
        CASE
            WHEN A.qty = (
              MAX(A.qty) OVER (PARTITION BY A.user)
            ) THEN A.no
        END as max_qty_no
    FROM
        A
) C ON C.user = B.user AND
       C.max_qty_no IS NOT NULL;

return

id user no
1 A 10
1 A 11
2 B 12

由于您希望每个用户的 MAX(no) 数量最多,因此您需要应用额外的 selection 标准。分区负责 select 每个用户 MAX(qty) 的行,但您仍然需要 select 每个不同用户的 MAX(no) 行 - 您可以通过使用MAX 聚合函数与 GROUP BY 相结合。通过这个小改动,您可以 return 预期的结果:

SELECT
    B.id,
    B.user,
    MAX(C.max_qty_no)
FROM
    B
LEFT JOIN (
    SELECT 
        A.user,
        CASE
            WHEN A.qty = (
              MAX(A.qty) OVER (PARTITION BY A.user)
            ) THEN A.no
        END as max_qty_no
    FROM
        A
) C ON C.user = B.user AND
       C.max_qty_no IS NOT NULL
GROUP BY B.id, B.user;

您想对每个用户的 A 行进行排名,并且仅 select 排名最好的行。到目前为止,这个排名只在一列上,因此您可以简单地将值与最大值进行比较。然而,现在必须考虑两列而不是一列来完成排名。您可以使用 ROW_NUMBER 进行此排名:

select id, user, no
from
(
  select
    b.id, b.user, a.no,
    row_number() over (partition by b.user order by a.qty desc, a.no desc) as rn
  from a
  join b on b.user = a.user
) ranked
where rn = 1;