sql-server - 每组前 2 名订购了 SQL Server
问题描述
我有 8 条记录
Name Value Product
--------------------------
Abraham 4 A
Lincoln 6 B
Abraham 4 C
Lincoln 2 D
Lincoln 3 E
Lincoln 2 F
Abraham 1 G
Abraham 9 H
亚伯拉罕有 4 条记录,林肯也有。
从 SQL 中,我需要 Abraham 的前 2 个值和 Lincoln 的前 2 个值
我试过了:
SELECT TOP 2 WITH TIES
NAME,
VALUE,
PRODUCT
FROM
blabla
JOIN
blabla...
ORDER BY
NAME
这需要每个名称中的 2 个,但不是最有价值的,因为我没有按 desc 设置 VALUE 顺序。
但我不能按 desc 放置 VALUE 订单,因为顶部有领带。
我需要的是让我的 TOP WITH TIES 仅适用于 ORDER BY NAME (如果有办法做到这一点,比如将顶部与第一个 order by 联系起来),但我只需要它们的 2 个最大值.
我需要的最终结果:
Abraham 9 H
Abraham 4 C
Lincoln 6 B
Lincoln 3 E
PS:这只是我想要的模拟,原始查询有超过 100 行的联合和东西,所以我认为最好简化。
解决方案
一个解决方案是一个CROSS APPLY
withTOP
和ORDER BY
。您从名称列表开始,然后调用返回每个名称的“函数”。TOP
SELECT
N.Name,
V.Value,
V.Product
FROM
(SELECT DISTINCT Y.Name FROM YourTable AS Y) AS N
CROSS APPLY (
SELECT TOP 2 WITH TIES
P.Value,
P.Product
FROM
YourTable AS P
WHERE
N.Name = P.Name
ORDER BY
P.Value DESC
) AS V
请记住,使用WITH TIES
可以使TOP
返回的行数超过提供的行数(以您的示例为 2),以防存在值的联系。
如果您需要显示没有产品的名称(在此示例中它不起作用,因为两者都来自同一个表),您可以切换CROSS APPLY
for a OUTER APPLY
,它的行为类似于 a LEFT JOIN
,因为它会返回NULL
值(但不是2 行!)。
推荐阅读
- c# - 以编程方式对输入进行 SSIS 脚本组件转换
- python - 如何将 python 代码中的 excel 文件写入托管在 IIS 服务器上的服务器位置?
- jquery - 单击按钮后弹出显示
- node.js - 如何在雅典娜查询执行结果后获取 S3 url
- firebase - Firebase 侦听器会比普通的“快照”产生更多的读取吗?
- javascript - Javascript 中的有趣字符,但 HTML 中没有
- c++ - C++ 中的联合(请解释一下)
- sql - SQL 分解层次结构
- java - Jackson:将类型信息与序列化数据一起存储
- angular - 如何停止在角垫片中添加新值和重复值?