1

Top句を使用せずにテーブルから上位40%を選択する方法(または上位パーセント、割り当ては少しあいまいです)?この質問は、T-SQL、SQLServer2008に関するものです。割り当てにTopを使用することは許可されていません。

ありがとう。

これは私が試したものですが、複雑に思えます。もっと簡単な方法はありませんか?

select top (convert (int, (select round (0.4*COUNT(*), 0) from MyTable))) * from MyTable
4

5 に答える 5

5

NTILE を使用

CREATE TABLE  #temp(StudentID CHAR(3),  Score  INT)

INSERT #temp  VALUES('S1',75 )
INSERT #temp  VALUES('S2',83)
INSERT #temp  VALUES('S3',91)
INSERT #temp  VALUES('S4',83)
INSERT #temp  VALUES('S5',93 )
INSERT #temp  VALUES('S6',75 )
INSERT #temp  VALUES('S7',83)
INSERT #temp  VALUES('S8',91)
INSERT #temp  VALUES('S9',83)
INSERT #temp  VALUES('S10',93 )

SELECT * FROM (
SELECT NTILE(10) OVER(ORDER BY Score) AS NtileValue,*
FROM #temp) x
WHERE NtileValue <= 4
ORDER BY 1

興味深いことに、今日 NTILE についてブログを書きました。NTILE() ウィンドウ関数を使用している人はいますか?

于 2013-01-16T20:23:06.817 に答える
5

関数を試してくださいNTILE

;WITH YourCTE AS
(
    SELECT 
        (some columns),
        percentile = NTILE(10) OVER(ORDER BY SomeColumn DESC)
    FROM
        dbo.YourTable
)
SELECT *
FROM YourCTE
WHERE percentile <= 4

NTILE(10) OVER(....)、データに対して 10 のパーセンテージ グループを作成します。したがって、上位 40% がグループ番号です。その結果の 1、2、3、4

于 2013-01-16T20:22:00.080 に答える
3

これまでの回答の問題はNTILE(10)、テーブルに15行ある場合、40%(6)を構成する正しい数ではなく、8行(53%)を返すことです。

行数がバケット数で均等に割り切れない場合、余分な行はすべて均等に分散されるのではなく、最初のバケットに入ります。

この代替手段(SQL Menaceのテーブルを借用)は、その問題を回避します。

WITH CTE
     AS (SELECT *,
                ROW_NUMBER() OVER ( ORDER BY Score) AS RN,
                COUNT(*) OVER()                     AS Cnt
         FROM   #temp)
SELECT StudentID,
       Score
FROM   CTE
WHERE  RN <= CEILING(0.4 * Cnt )
于 2013-01-16T20:36:36.153 に答える
1

レコード数に関係なく、ROWCOUNT を計算して設定します。次に、限定セットのクエリを実行します。

declare @rc as integer
select @rc = count(*)*0.40 from CTE
Set ROWCOUNT @rc
select * from CTE

ROWCOUNT はまだ廃止されていません。http://msdn.microsoft.com/en-us/library/ms188774.aspx を参照してください。

于 2013-01-16T20:25:57.960 に答える
1

Top t-sql コマンドの使用:

select top 10 [Column_1],
[Column_2] from [Table]
order by [Column_1]

ページング方法の使用:

select 
[Column_1],
[Column_2]
from 
    (Select ROW_NUMBER() Over (ORDER BY [Column_1]) AS Row,
    [Column_1],
    [Column_2]
    FROM [Table]) as [alias]
WHERE (Row between 0 and 10)

これは、[Column_1] の順序で上位 10 を検索しています...これは、[変数] の文書化方法を使用していることに注意してください。

列名とテーブル名を指定できれば、はるかに有益な t-sql を記述できます。たとえば、上位 40% を見つけるには、別のサブクエリを実行してすべての行の数を取得し、除算を行う必要があります。メインクエリを実行する前に、これをクエリとして実行する可能性があります。

于 2013-01-16T20:29:59.423 に答える