我是 SQL 初学者。我需要根据下面的优先级条件选择不同的数据(主题,用户编号)按主题,用户编号列排序。
条件:
如果数据满足条件1(如user_1/user_2/user_4),则直接从表A中获取数据。
但是,如果按主题和用户编号排序的费率相同(例如 user_3 / user_5),则与具有相同 A.Subject 和 A.UserNo 的表 B 连接并从表 B 中获取数据(主题、用户编号)
[表A]
主题 | 用户号 | 最高_率 |
---|---|---|
A | 用户_1 | 10 |
A | 用户_2 | 8 |
A | 用户_3 | 5 |
B | 用户_3 | 5 |
B | user_4 | 10 |
C | user_5 | 20 |
D | user_5 | 20 |
[表B]
主题 | 用户号 | 最高_率 |
---|---|---|
A | 用户_1 | 10 |
A | 用户_2 | 8 |
A | 用户_3 | 100 |
B | 用户_3 | 5 |
B | user_4 | 10 |
C | user_5 | 20 |
D | user_5 | 200 |
预期结果集:
主题 | 用户号 |
---|---|
A | 用户_1 |
A | 用户_2 |
A | 用户_3 |
B | user_4 |
D | user_5 |
你能告诉我如何在 SQL Server 中进行我想要的查询吗?
SELECT
A.Subject, A.UserNo, A.highest_Rate
FROM
Table A
INNER JOIN
Table B ON A.UserNo = B.UserNo
AND A.Subject = B.Subject
由于我现在无法访问数据库,所以无法说出我尝试查询的详细信息。
也许是这样的:
select UserNo, Subject
from (
select t.UserNo, t.Subject
, row_number() over(partition by t.userno order by t.highest_rate desc, t2.highest_rate desc) as sort
from (
VALUES (N'A', N'user_1', 10)
, (N'A', N'user_2', 8)
, (N'A', N'user_3', 5)
, (N'B', N'user_3', 5)
, (N'B', N'user_4', 10)
, (N'C', N'user_5', 20)
, (N'D', N'user_5', 20)
) t (Subject,UserNo,highest_Rate)
left join (
VALUES (N'A', N'user_1', 10)
, (N'A', N'user_2', 8)
, (N'A', N'user_3', 100)
, (N'B', N'user_3', 5)
, (N'B', N'user_4', 10)
, (N'C', N'user_5', 20)
, (N'D', N'user_5', 200)
) t2 (Subject,UserNo,highest_Rate)
ON t2.userNo = t.UserNo
AND t2.Subject = t.Subject
) x
where x.sort = 1
对于每个用户,row_number 将首先按主表的最高评分返回顺序,并按 DESC 排序作为决胜局第二个表的最高评分。
你能告诉我如何在 SQL Server 中进行我想要的查询吗?
我希望我正确理解了你的需求,那么你可以尝试使用这个SQL查询:
SELECT Subject, UserNo
FROM (
SELECT A.Subject, A.UserNo, MAX(A.highest_Rate) AS highest_Rate
FROM tableA A
GROUP BY Subject, UserNo
UNION ALL
SELECT B.Subject, B.UserNo, MAX(B.highest_Rate) AS highest_Rate
FROM tableB B
GROUP BY Subject, UserNo
) AS T
ORDER BY Subject, UserNo;
附注
如果它对您不起作用或您有任何疑问,请告诉我。