セットからサンプル行を選択する必要があります。たとえば、選択クエリが x 行を返す場合、 x が 50 より大きい場合、50 行のみを返しますが、上位 50 行だけでなく、結果セット全体に均等に分散する 50 行を返します。この場合のテーブルには、ルート (GPS 位置 + DateTime) が記録されます。DateTime で注文していますが、緯度と経度の値の適切なサンプルが必要です。よろしくお願いします [SQL Server 2008]
4 に答える
SQL Server でサンプル行を取得するには、次のクエリを使用します。
SELECT TOP 50 * FROM Table
ORDER BY NEWID();
n 行ごと(この例では 10行目)を取得する場合は、次のクエリを試してください。
SELECT * From
(
SELECT *, (Dense_Rank() OVER (ORDER BY Column ASC)) AS Rank
FROM Table
) AS Ranking
WHERE Rank % 10 = 0;
他の一般的な RDBMS のランダム行を選択するクエリのその他の例は、http: //www.petefreitag.com/item/466.cfmにあります。
n 行ごとに 50 を取得します。
SELECT *
FROM table
WHERE row_number() over() MOD (SELECT Count(*) FROM table) / 50 == 0
FETCH FIRST 50 ROWS ONLY
ランダムなサンプルが必要な場合は、jimmy_keen の回答を使用してください。
更新:MS SQLで実行するための要件に関しては、これに変更する必要があると思います(ただし、テストするMS SQL Serverはありません):
SELECT TOP 50 *
FROM (
SELECT t.*, row_number() over() AS rn, (SELECT count(*) FROM table) / 50 AS step
FROM table t
)
WHERE rn % step == 0
乱数として取得される選択の結果セットに計算列を追加し、その列でソートされた上位 50 を選択することをお勧めします。これにより、ランダムなサンプルが得られます。
例えば:
SELECT TOP 50 *, RAND(Id) AS Random
FROM SourceData
ORDER BY Random
ここで、SourceData はソース データ テーブルまたはビューです。ちなみに、これは SQL Server 2008 上の T-SQL を想定しています。また、データ ソースに一意の ID を持つ Id 列があることも前提としています。ID が非常に小さい数値の場合は、次のように、RAND に渡す前に大きな整数を乗算することをお勧めします。
RAND(Id * 10000000)
静的に正しいサンプルが必要な場合、tablesampleは間違った解決策です。ここでMicrosoftResearchの論文に基づいて説明した良い解決策は、CAST(ROW_NUMBER()OVER(...)AS BYTE)AS RAND_COL_のような追加の列を含む、テーブル上にマテリアライズドビューを作成することです。この列にインデックスを追加し、他の興味深い列を追加して、クエリの統計的に正しいサンプルをかなり迅速に取得します。(WHERE RAND_COL_ = 1を使用)。