Получить данные за последние двенадцать месяцев из базы данных - PullRequest
0 голосов
/ 09 января 2011

Я пытаюсь работать с базой данных о безработице из данных департамента статистики труда (доступно по адресу ftp: //ftp.bls.gov/pub/time.series/la/)

Мне нужно получить данные за последние 12 месяцев для любого данного состояния, что сложнее, чем просто выбрать все данные за прошлый год, поскольку они не всегда имеют данные за последние несколько месяцев (сейчас данные за последний месяц - ноябрь 2010 г.).

Я знаю, какая запись самая новая, и поля даты, с которыми я работаю в базе данных:

period_name (название месяца) год (M01, M02 и т. д. для января, февраля)

Мой текущий SQL-код, который извлекает данные из набора таблиц JOINed:

USE unemploymentdata;
SELECT DISTINCT series.series_id, period_name, year, value, series.area_code,
       footnote_codes, period_name, measure_text, area_text, area_type_text
FROM state_overview 
LEFT JOIN series ON state_overview.series_id=series.series_id 
LEFT JOIN footnote ON state_overview.footnote_codes = footnote.footnote_code
LEFT JOIN period ON state_overview.period = period.period
LEFT JOIN measure ON series.measure_code = measure.measure_code
LEFT JOIN area ON series.area_code=area.area_code
LEFT JOIN area_type ON area.area_type_code=area_type.area_type_code
WHERE area_text = 'State Name' AND year > 2009
ORDER BY state_overview.period, measure_text;

Есть идеи?

Ответы [ 4 ]

0 голосов
/ 13 января 2014

Лучший способ - взять правильное значение strtotime ($ a) 1 год назад, а затем при получении значения из базы данных найти strtotime ($ b) даты в каждом результате. Сейчас

if($b < $a){
   continue;
}
else {
   //do something.
}
0 голосов
/ 09 января 2011

Поскольку у вас есть текстовые значения для работы с месяцем и годом, вам необходимо преобразовать их в значения DATE в формате MySQL и затем позволить MySQL вычислить интервал прошлого года следующим образом:

SELECT ... WHERE STR_TO_DATE(CONCAT(period_name,' 1 ',year),'%M %d %Y') >= DATE_SUB(STR_TO_DATE(CONCAT(most_recent_period_name,' 1 ',most_recent_year),'%M %d %Y'), INTERVAL 1 YEAR) ...;

Функция CONCAT() просто строит строку типа «Месяц 1 ГГГГ», а функция STR_TO_DATE() берет эту строку и строку форматирования, чтобы указать, как ее проанализировать, и преобразовать в DATE.

Примечание. Этот запрос, вероятно, отстой по индексу, но он должен работать.:)

0 голосов
/ 09 января 2011

Вы можете сохранить год и месяц как дату, даже если у вас нет информации о дне. Просто используйте первое число каждого месяца.

{2009, 'M1'} => 2009-01-01
{2009, 'M2'} => 2009-02-01
{2009, 'M3'} => 2009-03-01

Это значительно упрощает арифметику дат, чем работа с подстроками (потенциально грязных) данных. Кроме того (и это большое), вы можете индексировать данные гораздо эффективнее. В качестве бонуса вы можете извлечь множество дополнительных вкусностей, используя DATE_FORMAT , например названия месяцев, количество дней в месяце и т. Д.

Все ли штаты имеют данные за все месяцы и обновляются ли данные одновременно? Ответ на этот вопрос определяет, какую стратегию запроса следует использовать.

0 голосов
/ 09 января 2011

Я думаю, что некоторые изменения в предложении WHERE должны это сделать, но для эффективности / простоты вы также должны добавить MAX(year) в раздел SELECT.

SELECT ...... MAX(year) as max_year .....

WHERE area_text = 'State Name' 
  AND year >= max_year - 1
  AND period >= (SELECT MAX(period) WHERE year = max_year)
  ORDER BY state_overview.period, measure_text;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...