2017-12-13 4 views
1

次のシナリオでは、特定の条件で同じテーブルの上位3つのレコードが必要で、最初のクエリ結果を除外して2番目のクエリレコードとマージする必要があります。SQL Serverの異なる2つのクエリのレコードを並べ替える方法

表A:最新のレコードを最新のレコードのページインデックス1と行数5

Id Name Flag 
    ---------------- 
    6 F 1 
    4 D 1   first require flag =1 first 3 records 
    1 A 1 
    --------------------------------------- 
    8 H 0 
    7 G 0 

ページインデックス2と行数5と

Id Name Flag 
    ------------- 
    1 A 1 
    2 B 0 
    3 C 0 
    4 D 1 
    5 E 0 
    6 F 1 
    7 G 0 
    8 H 0 

トップ3フラグ= 1

Id Name Flag 
    -------------- 
    6 F 1 
    5 E 0 
    3 C 0 
    2 B 0 

これをSQLクエリでどのように実現できますか?

IF (@PageNumber = 0) 
BEGIN 
    SELECT TOP (@RowsPerPage) [Id], [Name], [Flag] 
    FROM 
     (SELECT [Id], [Name], [Flag] 
     FROM 
      (SELECT TOP 3 [Id], [Name], [Flag] 
       FROM [A] 
       WHERE Flag = 1 
       ORDER BY Id DESC 

       UNION    

       SELECT [Id], [Name], [Flag] 
       FROM [A] 
       ORDER BY Id DESC) T 
    END 
    ELSE 
    BEGIN 
     // Normal paging query excluding top 3 flag records. 
    END 
+2

はい、それはタイプミスです –

+0

を設定し、それは以下の私の答えをチェックしてくださいませんが –

+0

ます試してみてください –

答えて

0

私はID 6は、両方の結果である参照この

WITH CTE 
AS 
(
    SELECT 
     Seq1 = ROW_NUMBER() OVER(PARTITION BY Flag ORDER BY Id DESC), 
     Seq2 = ROW_NUMBER() OVER(ORDER BY Id DESC), 
     Id, 
     Name, 
     Flag 
     FROM t1  
) 
SELECT 
Seq1, 
id, 
name, 
flag 
FROM CTE 
    WHERE Seq1 < 4 

UNION ALL 

SELECT 
Seq2, 
id, 
name, 
flag 
FROM CTE 
    WHERE Seq1 >3 
    ORDER BY 4 desc,1 
関連する問題