2012-11-13 6 views
2

Мне нужно получить данные между декабрем 2012 года по ноябрь 2014 года.Предельные ряды каждого месяца?

Каждый месяц мне нужно всего 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 запрос меньше?

+1

Вы можете проверить заголовок ** Выберите верхние N строк из каждой группы ** в [этой статье] (http://www.xaprb.com/blog/2006/12/07/ как-к-select-the-firstleastmax-row-per-group-in-sql /), который решает вашу проблему. Короче говоря, он предлагает цикл в SQL. – Stecman

ответ

1

Я думаю, что вы ищете статью GROUP BY. Мне нужно знать немного больше, чтобы дать вам окончательный ответ. Но следующий pseduo-запрос может помочь вам в правильном направлении.

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; 
+0

Это не сработает, см. Пример моего SQL-запроса. Каждый месяц я хочу только 1500 строк. Пример: 'WHERE YEAR (submit_date) = 2013 AND MONTH (submit_date) = 3 limit 1500;' –

+0

Например, 1500 строк за январь 2013 года, 1500 строк за февраль 2013 года и так далее до ноября 2014 года. –

+0

Я обновил свое сообщение до более подробно отражают ваш вопрос, но спасибо за чрезмерно резкий голос. Вам нужно уточнить свой вопрос, указав свою схему. Вы не можете побороть меня, когда вы дадите мне образец. –

2

Есть некоторый список вариантов здесь: http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/

IMHO один из лучших - это счетчик строк:

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 (я делаю разрез для 2-х элементов, а не 1500)

+0

Спасибо! Что такое «индекс силы (IX_submit_date)»? Кажется, добавить индекс? –

+0

Да для лучшей производительности СУБД. Вам это не нужно, но я бы предложил. – Varon

+0

В вашем SQL-запросе, как указать submit_date между декабрем 2012 года и ноябрем 2014 года? –

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; 
Смежные вопросы