【问题标题】:Ranking using multiple columns使用多列进行排名
【发布时间】:2020-06-05 09:09:43
【问题描述】:

对于这种情况,我真的需要您的帮助: 我有这张表(没有“排名”列):

+------------+---------+---------+-------+------+--------+------------+------+
| Profile ID | Email   | lname   | fname | Type | Salary | Created    | Rank |
+------------+---------+---------+-------+------+--------+------------+------+
| 1          | a@a.com | Templar | Simon | A    | 200    | 01.01.2020 | 2    |
+------------+---------+---------+-------+------+--------+------------+------+
| 2          | a@a.com | Madison | James | B    | 100    | 01.01.2020 | 1    |
+------------+---------+---------+-------+------+--------+------------+------+
| 3          | a@a.com | Adams   | Dan   | C    | 300    | 02.01.2020 | 2    |
+------------+---------+---------+-------+------+--------+------------+------+
| 4          | b@b.com | Adams   | Emily | A    | 200    | 04.01.2020 | 2    |
+------------+---------+---------+-------+------+--------+------------+------+
| 5          | b@b.com | Adams   | Kim   | C    | 300    | 05.01.2020 | 1    |
+------------+---------+---------+-------+------+--------+------------+------+

我想使用以下标准根据重复的电子邮件对个人资料进行排名:

  • 如果 'Type' = B,那么这就是胜利
  • 如果 'Type' = A 或 C,并且 lname 相同,则根据最高薪水排名
  • 如果 'Type' = A 或 C,并且 lname 不相同,则不会发生任何变化,那么两个配置文件将获得相同的排名

如何使用 SQL Ranking 做到这一点?

【问题讨论】:

  • 欢迎,当 'Type' = A 或 C,lname 不一样时会发生什么
  • 请根据您提供的数据显示结果。
  • 就您的输出而言,“这将赢得一切”是什么意思?
  • @user2474598 您能否使用所需的输出更新您的问题,而不是使用评论?
  • 预期结果是什么?

标签: sql tsql sql-server-2012


【解决方案1】:

您想使用rank()。我认为逻辑是这样的:

select t.*,
       rank() over (partition by email
                    order by (case when type = 'B' then 1 else 2  end),
                             salary desc
                   ) as ranking                          
from t;

很不清楚lname 相同是什么意思。和什么一样?但我认为这对你的逻辑来说是不必要的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-09-29
    • 2013-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-07
    • 2010-11-29
    相关资源
    最近更新 更多