1

表:

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

上記のデータから、特定の ConditionID の TOP N レコードを選択し、それを別の条件 ID からの上位 N の結果の別のセットとマージする必要があります。

例: 条件 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() を使用して同様のことを行う方法はありますか?

編集:

上位 2 位と上位 3 位の結果は contentid と重複してはならないため、特定の contentid が既にクエリ 1 の一部である場合、それは次の上位 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 に答える