19

Sql Server 2005 での選択クエリのソリューションが必要です。

特定の基準に一致するすべてのレコードのちょうど半分をそれぞれ保持する 2 つの ResultSet を返すクエリが必要です。TOP 50 PERCENT を Order By と組み合わせて使用​​しようとしましたが、テーブル内のレコード数が奇数の場合、両方の結果セットに 1 つのレコードが表示されます。レコードセット間でレコードを複製したくありません。例:

TheID (PK) フィールドと TheValue フィールド (varchar(10)) および 5 つのレコードを含む単純なテーブルがあります。ここでは、where 句をスキップします。

SELECT TOP 50 PERCENT * FROM TheTable ORDER BY TheID asc

選択した ID の 1,2,3 になります

SELECT TOP 50 PERCENT * FROM TheTable ORDER BY TheID desc

選択した ID の 3,4,5 になります

3は重複です。もちろん、実際のクエリはかなり複雑で、多数の where 句とサブクエリがあります。

4

6 に答える 6

48

SQL Server 2005 など:

select *, ntile(2) over(order by theid) as tile_nr from thetable

ntile(n)出力をそれぞれ同じサイズの n 個のセグメントに割り当てます (行数が n で割り切れない場合は丸めます)。したがって、これにより出力が生成されます。

1 | value1 | 1
2 | value2 | 1
3 | value3 | 1
4 | value4 | 2
5 | value5 | 2

上半分または下半分だけが必要な場合は、これをサブクエリに入れる必要があります。

select theid, thevalue from (
  select theid, thevalue, ntile(2) over(order by theid) as tile_nr from thetable
) x
where x.tile_nr = 1

上半分を返し、同様x.tile_nr = 2に下半分に使用します

于 2010-05-05T19:13:37.443 に答える
8

次の 2 つのクエリを使用できます。

SELECT * FROM (
    SELECT *, ROW_NUMBER() OVER (ORDER BY TheID) AS rn FROM TheTable
) T1
WHERE rn % 2 = 0

SELECT * FROM (
    SELECT *, ROW_NUMBER() OVER (ORDER BY TheID) AS rn FROM TheTable
) T1
WHERE rn % 2 = 1
于 2010-05-05T19:04:56.810 に答える
2

これが SQL Server 2000 の場合、次のように中間値の PK を見つける傾向があります。

Declare @MiddleId int

Set @MiddleId = (
                Select TOP 1 PK
                From (
                        Select TOP 50 PERCENT PK
                        From Table
                        Order By TheId ASC
                        )
                Order By TheId DESC
                )

Select ...
From Table
Where TheId <= @MiddleId

Select ..
From Table
Where TheId > @MiddleId

SQL Server 2005 でも同じことをしたいと思いますが、CTE を使用できます

;With NumProjects As
    (
    Select Id, ROW_NUMBER() OVER (ORDER BY TheId ASC ) As Num
    From Table
    )
Select @MiddleId = Id
From Table
Where Num = CEILING( (Select Count(*) From Table) / 2 )
于 2010-05-05T19:14:11.767 に答える
1

これを試して:

DECLARE @CountOf int,@Top int,@Bottom int
SELECT @CountOf=COUNT(*) FROM YourTable
SET @Top=@CountOf/2
SET @Bottom=@CountOf-@Top
SELECT TOP (@Top) * FROM YourTable ORDER BY 1 asc --assumes column 1 is your PK
SELECT TOP (@Bottom) * FROM YourTable ORDER BY 1 desc --assumes column 1 is your PK
于 2010-05-05T19:13:51.653 に答える