我有一张桌子:
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栏的问题。
这似乎很容易,但我一直在挣扎。我真的很感激你的帮助
发布于 2022-11-23 15:00:32
不确定为什么不想/不能使用row_number(),但以下是一些使用交叉应用的代码。
首先,我用您的规范和虚拟数据创建了一个表:
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);然后,这段代码将得到实际的输出。
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行,每行重复两次。如果这一解释不清楚,请查看查询的此版本,以查看重复:
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 A2https://stackoverflow.com/questions/74548229
复制相似问题