如何在不使用 ms-sql 中的 rank/row_number 函数的情况下获得每个类别的前 2 名

影音

我使用的是 MS-SQL 2016。

我有一个场景,需要为每个组获得前 2 名的奖金,RANK 和 ROW_NUMBER是不允许的,这是您可以用来生成表和数据的代码:

Create table Freelancer (id int, fl_name varchar(20), bonus int, fl_group varchar(50))


insert into Freelancer (id, fl_name, bonus, fl_group) Values (1, 'John', 1000, 'SQL')
insert into Freelancer (id, fl_name, bonus, fl_group) Values (2, 'Jane', 990, 'MySQL')
insert into Freelancer (id, fl_name, bonus, fl_group) Values (3, 'Jimmy', 320, 'Oracle')
insert into Freelancer (id, fl_name, bonus, fl_group) Values (4, 'Jeff', 802, 'DynamoDB')
insert into Freelancer (id, fl_name, bonus, fl_group) Values (5, 'Johnathan', 2345, 'Hive')
insert into Freelancer (id, fl_name, bonus, fl_group) Values (6, 'Jeffery', 321, 'RDS')
insert into Freelancer (id, fl_name, bonus, fl_group) Values (7, 'Jane2', 1990, 'MySQL')
insert into Freelancer (id, fl_name, bonus, fl_group) Values (8, 'Jimmy3', 321, 'Oracle')
insert into Freelancer (id, fl_name, bonus, fl_group) Values (9, 'Jeff4', 803, 'DynamoDB')
insert into Freelancer (id, fl_name, bonus, fl_group) Values (10, 'Johnathan5', 345, 'Hive')
insert into Freelancer (id, fl_name, bonus, fl_group) Values (11, 'Jeffery', 32, 'RDS')
insert into Freelancer (id, fl_name, bonus, fl_group) Values (12, 'Jane3', 1190, 'MySQL')
insert into Freelancer (id, fl_name, bonus, fl_group) Values (13, 'Jimmy4', 322, 'Oracle')
insert into Freelancer (id, fl_name, bonus, fl_group) Values (14, 'Jeff5', 8002, 'DynamoDB')
insert into Freelancer (id, fl_name, bonus, fl_group) Values (15, 'Johnathan6', 235, 'Hive')
insert into Freelancer (id, fl_name, bonus, fl_group) Values (16, 'Jeffery7', 31, 'RDS')
insert into Freelancer (id, fl_name, bonus, fl_group) Values (17, 'Jack', 34, 'Redshift')
insert into Freelancer (id, fl_name, bonus, fl_group) Values (18, 'Jennifer', 121, 'Aurora')
insert into Freelancer (id, fl_name, bonus, fl_group) Values (19, 'Jackson', 425, 'Redis')

预期的结果是,例如在组DynamoDBJeff5(8002)和Jeff4(803)将被拾取的

尽管我在子句中指定了前 2 个,但我已经尝试过的结果如下,但没有返回所需的结果:

select *
from Freelancer t
where t.ID in (
    select top 2 ID
    from Freelancer tt
    where tt.fl_name = t.fl_name
    order by tt.bonus desc
    )
order by fl_group, bonus desc

我的结果:

在此处输入图片说明

尼库尼·萨塔西亚

请尝试此解决方案,在此解决方案中听到我已将 fl_group 合并为您的类别,并获取 fl_group 明智的前 2 条记录。

声明临时表

declare @Freelancer as TABLE (id int, fl_name varchar(20), bonus int, fl_group varchar(50))

插入样本数据

insert into @Freelancer(id, fl_name, bonus, fl_group) Values(1, 'John', 1000, 'SQL')
,(2, 'Jane', 990, 'MySQL')
,(3, 'Jimmy', 320, 'Oracle')
,(4, 'Jeff', 802, 'DynamoDB')
,(5, 'Johnathan', 2345, 'Hive')
,(6, 'Jeffery', 321, 'RDS')
,(7, 'Jane2', 1990, 'MySQL')
,(8, 'Jimmy3', 321, 'Oracle')
,(9, 'Jeff4', 803, 'DynamoDB')
,(10, 'Johnathan5', 345, 'Hive')
,(11, 'Jeffery', 32, 'RDS')
,(12, 'Jane3', 1190, 'MySQL')
,(13, 'Jimmy4', 322, 'Oracle')
,(14, 'Jeff5', 8002, 'DynamoDB')
,(15, 'Johnathan6', 235, 'Hive')
,(16, 'Jeffery7', 31, 'RDS')
,(17, 'Jack', 34, 'Redshift')
,(18, 'Jennifer', 121, 'Aurora')
,(19, 'Jackson', 425, 'Redis')

按类别划分的前 2 名记录

select *
from @Freelancer t
where t.ID in (
    select top 2 ID
    from @Freelancer tt
    where tt.fl_group = t.fl_group
    order by id
    )
order by fl_group,id

输出

输出

在这里,您还可以使用 join 代替子查询来提高查询性能。

有关更多信息,您可以尝试此解决方案请访问此 URL:查询编辑器

我希望这对你有用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在不使用MS SQL中的SubQuery的情况下比较Max(Count(*))值?

如何在不使用 MS SQL 中的 JOIN 的情况下检索所有链接的行和列

如何在不使用MS SQL Server Management Studio的情况下在SQL Server中更改默认数据库?

如何在不使用全局变量的情况下从函数中添加2个列表?

如何在不使用类名的情况下从类中访问类本身

如何在不使用连接参数的情况下从python中的.sql文件中读取数据

如何在不使用存储过程的情况下将varchar内容(1,2,3)数据转换为SQL中的整数数组?

如何在不使用oracle sql中不使用Regex的情况下替换指定字符以外的字符?

如何在不使用宏的情况下在MS Word中查找文档变量

如何在不使用空格的情况下在MS Word 2003中查找逗号?

如何在不使用循环的情况下列出每个帐户信息并在sql中求和

如何在SQL中不使用DISTINCT的情况下删除重复值?

如何在不使用 SQL 代码中的 groupby 的情况下选择最大行数?

如何在不使用 Python 中的 urlib2.urlopen 的情况下读取 URL?

Log4j2:如何在不使用Throwable的情况下获取类名和行号?

如何在不使用JS中任何ID的情况下按类名更改元素的样式属性?

在不使用任何扩展名的情况下,如何在GNOME面板中显示电池百分比?

如何在不安装MS Office和不使用Interop库的情况下读取服务器中的MS Office文件?

如何在不使用SQL的情况下从ILE RPG中的文件中获取字段的最大值?

如何在不使用 SQL 的情况下将 Dataframe 的多行转换为 Scala 中的单行(使用 Dataframe API)?

如何在不使用 SQL 的情况下使用 Entity Framework 有效删除表中的所有记录?

如何在不使用 Raw Sql Concat 的情况下相互连接 2 列

如何在不使用GROUP BY或PARTITION BY的情况下在Oracle SQL中对数据进行分组

如何在不使用Spark SQL的情况下在Spark中对数据帧进行排序?

如何在不使用数据透视的情况下将行转换或转置为 SQL 中的列?

如何在不使用任何转换的情况下从ssis中的执行sql任务插入,更新记录?

如何在不使用SQL Server 2008中的循环的情况下通过增量值更新字段的值?

如何在不使用 SQL Server 中的 where 查询的情况下从第 5 行中选择记录

如何在不使用 NOT IN 的情况下优化 SQL 查询