首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据编程语言的认知成绩选择前2名申请者

根据编程语言的认知成绩选择前2名申请者
EN

Stack Overflow用户
提问于 2022-11-23 14:16:01
回答 1查看 23关注 0票数 0

我有一张桌子:

代码语言:javascript
复制
CREATE TABLE applicants
(
    id INT PRIMARY KEY IDENTITY,
    [name] varchar(255),
    [age] int,
    [address] varchar(255),
    [programming language] varchar(255),
    [cognitive score] int
)

我需要根据每种编程语言的认知得分,选出前2名申请者。

我应该通过子查询或联接或类似的方法来完成这个任务,但不应该使用ROW_NUMBER()

我只需要3列结果:名称,认知得分,编程语言。

我知道ORDER BY vs只有3栏的问题。

这似乎很容易,但我一直在挣扎。我真的很感激你的帮助

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-23 15:00:32

不确定为什么不想/不能使用row_number(),但以下是一些使用交叉应用的代码。

首先,我用您的规范和虚拟数据创建了一个表:

代码语言:javascript
复制
DROP TABLE IF EXISTS #applicants;
CREATE TABLE #applicants (
    id INT PRIMARY KEY IDENTITY,
    [name] VARCHAR(255),
    [age] INT,
    [address] VARCHAR(255),
    [programming language] VARCHAR(255),
    [cognitive score] INT
);

INSERT INTO #applicants (name, age, address, [programming language], [cognitive score])
VALUES ('a', 20, 'address1', 'SQL', 70),
       ('b', 31, 'address2', 'SQL', 80),
       ('c', 32, 'address3', 'SQL', 90),
       ('d', 33, 'address4', 'C', 71),
       ('e', 34, 'address5', 'C', 81),
       ('f', 35, 'address6', 'C', 91),
       ('g', 36, 'address7', 'C#', 72),
       ('h', 37, 'address8', 'C#', 82),
       ('i', 38, 'address9', 'C#', 92);

然后,这段代码将得到实际的输出。

代码语言:javascript
复制
SELECT A.id,
       A.name,
       A.age,
       A.id,
       A.[programming language],
       A.[cognitive score]
FROM #applicants AS A
     CROSS APPLY (
    SELECT TOP 2 t.id,
                 t.[cognitive score]
    FROM #applicants AS t
    WHERE A.[programming language] = t.[programming language]
    ORDER BY t.[cognitive score] DESC
) AS A2
WHERE A.id = A2.id;

初始SELECT * FROM Applicants将绝对返回所有内容。CROSS APPLY的工作方式是寻找基于Cognitive Score的前2名,同时在Programming Language上进行匹配。

最后,它们使用ID返回,这迫使CROSS APPLY更像内部连接,并且只返回ID匹配的行。没有它,您将得到18行,因为9行,每行重复两次。如果这一解释不清楚,请查看查询的此版本,以查看重复:

代码语言:javascript
复制
SELECT A.id,
       A.name,
       A.age,
       A.id,
       A.[programming language],
       A.[cognitive score],
       A2.ID,
       A2.[cognitive score]
FROM #applicants AS A
     CROSS APPLY (
    SELECT TOP 2 t.id,
                 t.[cognitive score]
    FROM #applicants AS t
    WHERE A.[programming language] = t.[programming language]
    ORDER BY t.[cognitive score] DESC
) AS A2
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74548229

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档