2012-02-29 8 views
0

私は月のすべての日付のレコードを格納するテーブルを持っています。私はそれからいくつかのデータを取得したい。テーブルは非常に大きく、私はそれらのうちのいくつかだけを選ぶべきです。レコードに日付である "ric_date"という列がある場合、各日付のレコードを選択するにはどのようにしたらいいですか?月の各日から行を選択するSQL

の表は、1日の記録は100000件のレコードを持つことができるように大きいです。

+1

定義月の各日付から「fews」 –

+0

例えば、500のレコードください。 – lamwaiman1988

+1

使用しているSQL Serverのバージョンを教えてください。 –

答えて

1
WITH T AS (
    SELECT ric_date 
    FROM yourTable 
    WHERE rice_date BETWEEN @start_date AND @end_date -- thanks Aaron Bertrand 
    GROUP BY ric_date 
) 

SELECT CA.* 
FROM T 
CROSS APPLY (
    SELECT TOP 500 * -- 'a fews' 
    FROM yourTable AS YT 
    WHERE YT.ric_date = T.ric_date 
    ORDER BY someAttribute -- not required, but useful 
) AS CA 
+0

これがクエリに答えるかどうかわかりません。彼は、特定の月の各日付から "manys"日(これは今は500であると思います)を望んでいます(これはテーブル全体を解決するようです)、あなたは 'ric_date'に時間が含まれていないと仮定しました。 –

+0

それは魅力のように動作します! – lamwaiman1988

+0

@ gunbuster363これは、特定の月だけではなく、テーブル全体のデータを返しますか? –

0

ラフアイデア。現在の月の最初の3行(または任意の日に存在するもの)が取得されます。行が表示されていない日もあります。

DECLARE 
    @manys INT = 3, 
    @month DATE = DATEADD(DAY, 1-DAY(GETDATE()), DATEDIFF(DAY, 0, GETDATE())); 

;WITH x AS 
(
    SELECT some_column, ric_date, rn = ROW_NUMBER() OVER 
    (PARTITION BY ric_date ORDER BY ric_date) 
    FROM dbo.data 
    WHERE ric_date >= @month 
    AND ric_date < DATEADD(MONTH, 1, @month) 
) 
SELECT some_column, ric_date FROM x 
WHERE rn <= @manys; 

サポートインデックス(最も重要なのはric_date)がない場合、これは必ずしもハイエンドで拡張されません。

+0

こんにちはアーロン、 はFYI、あなたのクエリは、現在の月の前の月の最終日から行を返します。これを解決するには、> =>を変更します。 (このクエリでは、テーブルに何かが含まれている場合は、今後の月の行も返されます。) –

+0

@Steve Whoa、hey Steve。私はもともとやや違っていた。とにかく私のバージョンがOPに役立ったようには思われません。 –

+0

私にとってサミットの皆さんにお越しいただきたいと思います。あなたは、あなたが日付/時刻のクエリで間違いを犯したことに気づく必要はありません。 :) –

関連する問題