通过以下SQL 可以实现去掉一个最高分一个最低分 而且即就是最高 最低分有重复的也可以实现。
示例数据:
评委 歌手 得分
A | 1 | 75 |
A | 2 | 50 |
A | 3 | 78 |
A | 4 | 66 |
B | 1 | 88 |
B | 2 | 80 |
B | 3 | 77 |
B | 4 | 67 |
C | 1 | 75 |
C | 2 | 60 |
C | 3 | 90 |
C | 4 | 79 |
D | 1 | 88 |
D | 2 | 68 |
D | 3 | 89 |
D | 4 | 70 |
NULL | NULL | NULL |
数据库创建如下:
CREATE TABLE [dbo].[tb](
[评委] [varchar]( 1 ) COLLATE Chinese_PRC_CI_AS NULL,
[歌手] [ int ] NULL,
[得分] [ int ] NULL
) ON [PRIMARY]
[评委] [varchar]( 1 ) COLLATE Chinese_PRC_CI_AS NULL,
[歌手] [ int ] NULL,
[得分] [ int ] NULL
) ON [PRIMARY]
SQL实现如下:
SELECT
*
FROM dbo.tb
as
a WHERE 评委
+
cast(得分
as
varchar(
10
)) not
in
(
select top 1 评委 + cast(得分 as varchar( 10 )) FROM dbo.tb where tb.歌手 = a.歌手 ANd tb.得分 = (SElect min(得分) FROM tb as c where 歌手 = a.歌手)
union all
select top 1 评委 + cast(得分 as varchar( 10 )) FROM dbo.tb where tb.歌手 = a.歌手 ANd tb.得分 = (SElect Max(得分) FROM tb as c where 歌手 = a.歌手))
select top 1 评委 + cast(得分 as varchar( 10 )) FROM dbo.tb where tb.歌手 = a.歌手 ANd tb.得分 = (SElect min(得分) FROM tb as c where 歌手 = a.歌手)
union all
select top 1 评委 + cast(得分 as varchar( 10 )) FROM dbo.tb where tb.歌手 = a.歌手 ANd tb.得分 = (SElect Max(得分) FROM tb as c where 歌手 = a.歌手))