我们有一个数据库表,以这种方式列出选项更改:
日期|选项|值
2008年7月1日|选项a |值_a
2008年7月1日|选项b |值_b
2008年7月2日|选项A |值_a2
我们假设在有选项的第一个日期(主键是日期和选项)之前没有选项集。我们必须每天都这样做,每个选项都会在之后覆盖以前的更改,但不会向后覆盖。
我想知道如何加入这个表,这样我就可以每周获得每个选项的全套值最新值。类似以下内容:
日期|选项|值
2008年7月1日|选项a |值_a
2008年7月1日|选项b |值_b
2008年7月2日|选项A |值_a2
2008年7月2日|选项b |值_b
希望我答对你的问题
CREATE TABLE test.stack(日期日期,option_field VARCHAR(50),值INT(5))
TRUNCATE TABLE test.stack;替换为test.stackVALUES('08/07/01','optionA',5),('08/07/01','选项B',6),('08/07/02','选项A',11),('08/07/02','选项B',33),('08/07/22','选项B',43),('08/07/24','选项B',235),('08/07/02','选项A',9),('08/07/22','选项A',465),('08/07/24','optionA',421);
选择ts.date、ts.option_field、ts.value来自(选择s.date、s.option_field、s.value、WEEK(s.date)作为WEEK_no、MAX(DAYOFMONTH(s.date))作为day_noFROM test.stack sGROUP BY s.option_field,week_no)AS ts;
PS:我还没有检查的性能
我会使用group和order函数,类似于:
select
week(table1.date), table1.date, table1.option, table1.value
from
table1
group by week(date) , table1.option
order by date desc;
我在辅助通道上找到了所需的解决方案,所以它是:
SELECT
*
FROM
days days
INNER JOIN
table data
ON data.date <= days.date
LEFT OUTER JOIN
table data2
ON data2.date <= weeks.date
AND data2.option = data.option
AND data2.date > data.date
WHERE
data2.date IS NULL
表中的天数包括您需要信息的每一天,即天数列表。
这会考虑到您需要获取第一次加入信息的每一天(表中的天数)的前一天。第二个加入搜索具有更新信息的责任日。如果没有最近的信息,我们使用WHERE
data2.date IS NULL
行来考虑该行。