1

表:

ConditionId ContentId
10004       101
10004       102
10001       104
10001       103
10001       115

从上面的数据中,我需要为特定的 ConditionID 选择 TOP N 记录,并将其与另一组 top N 结果合并,形成不同的条件 id。

例如:对于条件 id 10001 给出 2 个结果,条件 ID 10004 给出前 3 个结果(这两个结果应该是唯一的并且不重叠):

我可以 :

SELECT top(2) * FROM TABLEA
WHERE Conditionid = 10001
UNION 
SELECT top(3) * FROM TABLEA
WHERE Conditionid = 10004

但这只是一个有限的场景,请求的条件 ID 可以是多个而不是上述场景中的 2 个。

出于性能原因,我不想编写动态 SQL,有没有办法通过使用 ConditionId IN() 来做类似的事情

编辑:

top 2 和 top 3 的结果不应与 contentid 重叠,因此如果特定 contentid 已经是 Query 1 的一部分,则它不应成为下一个 top N 的一部分,依此类推。

4

3 回答 3

5

一种方法(编辑以处理潜在的重复Conditionid)。

DECLARE @T TABLE
(
Conditionid INT,
Num INT
)

INSERT INTO @T 
VALUES(10001, 2),
      (10004, 3)


;WITH T(Conditionid, Num) AS
(
SELECT Conditionid,
       MAX(Num)
FROM @T 
GROUP BY Conditionid     
)
SELECT A.*
FROM  T
   CROSS APPLY (SELECT TOP (T.Num) *
                FROM   TABLEA A
                WHERE  A.Conditionid = T.Conditionid
                ORDER  BY A.ContentId) A 
于 2013-09-18T16:33:42.917 回答
3

Sql-Server 2005 及更高版本:

注意:排序结果后应取最高记录

declare table @t (numRecords int, id int)
insert into @t (numRecords, id)
values (2, 10001),
       (3, 10004)

;with cte as (
   select *, row_number() over (order by yourOrderCol) rn
   from yourTable
)
select cte.* 
from cte join @t t
     on cte.ConditionId = t.id and cte.rn <= t.numRecords
Order by cte.ConditionId
于 2013-09-18T16:36:07.453 回答
0
SELECT top(2) * FROM TABLEA
WHERE Conditionid in ('10004', '10005')
UNION 
SELECT top(3) * FROM TABLEA
WHERE Conditionid = ('10004', '10006')

这是你所期望的吗

于 2013-09-18T16:35:46.530 回答