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;
数据库: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;