2

2012 年 12 月から 2014 年 11 月までのデータを取得する必要があります。

毎月 1500 行しか必要ありません。

例えば:

SELECT * FROM data WHERE YEAR(submit_date) = 2012 AND MONTH(submit_date) = 12 limit 1500;
SELECT * FROM data WHERE YEAR(submit_date) = 2013 AND MONTH(submit_date) = 1 limit 1500;
SELECT * FROM data WHERE YEAR(submit_date) = 2013 AND MONTH(submit_date) = 2 limit 1500;
SELECT * FROM data WHERE YEAR(submit_date) = 2013 AND MONTH(submit_date) = 3 limit 1500;
and until Nov 2014

SQLクエリを小さく書く方法はありますか?

4

3 に答える 3

2

ここにいくつかのオプションのリストがあります: http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/

IMHO 最高のものの 1 つは、行カウンターを使用することです。

set @num := 0, @type := '';

select id, name, submit_date,
  @num := if(@type = CONCAT(YEAR(submit_date), MONTH(submit_date)), @num + 1, 1) as row_number,
  @type := CONCAT(YEAR(submit_date), MONTH(submit_date)) as dummy
from data force index(IX_submit_date)
group by id, name, submit_date
having row_number <= 2;

ここでテストできます: http://sqlfiddle.com/#!2/e829c/13 (1500 ではなく、2 つの要素に対してカットを行います)

于 2012-11-13T21:49:12.007 に答える
1

GROUP BY句を探していると思います。明確な答えを出すには、もう少し詳しく知る必要があります。しかし、次の疑似クエリは正しい方向に導くかもしれません。

SELECT *, SUM(some_field) 
FROM data
GROUP BY MONTH(submit_date)

または、1500 行のみが必要な場合は、日付順に並べた上位 1500 行を選択します

SELECT TOP(1500) *
FROM data
WHERE submit_date > '12-01-2012' AND submit_date < '11-01-2014'
ORDER BY MONTH(submit_date)

MySQLで使用できますLIMIT

SELECT *
FROM data
WHERE submit_date > '12-01-2012' AND submit_date < '11-01-2014'
ORDER BY MONTH(submit_date)
LIMIT 0,1500;
于 2012-11-13T21:27:26.483 に答える
0

クエリ間に UNION を追加するだけで、ほぼ同じように実行できます。ただし、毎月 1 つのクエリを作成する必要があります。

それ以外の場合は、返される行を列挙する必要があります。最初にレコードを並べ替えて列挙する必要があります。次に、その選択で選択を実行して、上位の X のみを取得できます。先月を含めるかどうかは不明です。

SET @prev_date='';
SELECT * FROM (
SELECT IF(@prev_date=submit_date, @incr := @incr+1, @incr:=1) AS row_num, 
data.*, 
(@prev_date := submit_date) AS set_prev_date 
FROM data WHERE submit_date BETWEEN "2012-12-01" AND "2014-11-30" 
ORDER BY submit_date
) tmp WHERE row_num<1500;
于 2012-11-13T22:48:14.307 に答える