Abs*_*Abs 7 sql-server sql-server-2012 greatest-n-per-group
我想知道是否有办法对SELECT
IN 中找到的每个匹配值进行查询。
考虑到下表包含IN
运算符引用的每个值的 100 条记录,我希望每次匹配只返回 50条记录。
SELECT TOP (50) COLUMN
FROM TABLE
WHERE COLUMN IN (1,2,3)
Run Code Online (Sandbox Code Playgroud)
有没有一种有效的方法可以做到这一点?
我能想到的唯一方法是对每个值执行查询,IN
考虑到实际查询从各种表中检索许多列,这将太慢。
Dan*_*man 10
一种方法是CROSS APPLY
:
SELECT top_50.ColumnName
FROM (VALUES(1),(2),(3)) AS id_list(ID)
CROSS APPLY(SELECT TOP(50) t.ColumnName
FROM TableName AS t
WHERE t.ID = id_list.ID
ORDER BY t.ColumnName) AS top_50;
Run Code Online (Sandbox Code Playgroud)
为了避免使用TOP
,返回随机行,ORDER BY
并且按列排序应该是唯一的。与复合键的索引ID
和ColumnName
将在此效率例如查询是有用的。
您可以ROW_NUMBER()
为此使用:
SELECT a, b, c
FROM (
SELECT a, b, c, ROW_NUMBER() OVER (PARTITION BY match_column ORDER BY d) AS rn
FROM t
WHERE match_column IN (1, 2, 3)
) AS x
WHERE rn <= 50
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
481 次 |
最近记录: |