我正在尝试使用劳工统计部门数据中的失业数据数据库(可在ftp://ftp.bls.gov/pub/time.series/la/获得)
我需要获取任何给定状态的最近12个月的数据,这比仅选择去年的所有数据更棘手,因为他们并不总是拥有最后几个月的数据(现在,上个月的数据是2010年11月。)
我知道哪条记录是最新的,我在数据库中使用的日期字段是:
period_name(月份名称) 年 期间(1月,2月的M01,M02等)
我当前用来从一堆JOINed表中提取数据的SQL是:
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;
有什么想法吗?
答案 0 :(得分:0)
我认为对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;
答案 1 :(得分:0)
由于您有月份和年份的文本值,您需要将它们转换为MySQL格式的DATE
值,然后让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()
函数只是构建一个像“Month 1 YYYY”这样的字符串,STR_TO_DATE()
函数正在使用该字符串和格式化字符串来告诉它如何解析它,并将其转换为DATE
。
注意:此查询可能在索引方面很糟糕,但它应该可行。 :)
答案 2 :(得分:0)
即使您没有日期信息,也可以将年份和月份存储为日期。只需使用每个月的第一天。
{2009, 'M1'} => 2009-01-01
{2009, 'M2'} => 2009-02-01
{2009, 'M3'} => 2009-03-01
这使得日期算术比处理(可能是脏的)数据的子串更容易。加上(这很大),您可以更有效地索引数据。作为奖励,您现在可以使用DATE_FORMAT提取许多额外的好东西,例如月份名称,nr个月等等。
所有州都有所有月份的数据,并且数据是否同时更新?这个问题的答案决定了你应该使用什么样的查询策略。
答案 3 :(得分:0)
最好的方法是采用正确的1年前的strtotime($ a)然后,当从数据库中获取值时,然后在每个结果中找到日期的strtotime($ b)。现在
if($b < $a){
continue;
}
else {
//do something.
}