我们有一个数据库表,以这种方式列出选项更改:
日期|选项|值
01/07/08 | optionA | value_a
01/07/08 | optionB | value_b
02/07/08 | optionA | value_a2
我们假设在第一个日期之前有一个选项(主键是日期和选项),没有选项设置。我们必须每天都这样做,每个选项都会覆盖之前的更改,但不会倒退。
我想知道如何加入此表格,以便每周都可以获得每个选项的全套值最新值。如下所示:
日期|选项|值
01/07/08 | optionA | value_a
01/07/08 | optionB | value_b
02/07/08 | optionA | value_a2
02/07/08 | optionB | value_b
答案 0 :(得分:0)
希望我的问题是正确的
CREATE TABLE test.stack ( 日期日期 ,option_field VARCHAR(50) ,价值INT(5) )
TRUNCATE TABLE test.stack; 更换为test.stack VALUES('08 / 07/01','optionA',5) ,('08 / 07/01','optionB',6) ,('08 / 07/02','optionA',11) ,('08 / 07/02','optionB',33) ,('08 / 07/22','optionB',43) ,('08 / 07/24','optionB',235) ,('08 / 07/02','optionA',9) ,('08 / 07/22','optionA',465) ,('08 / 07/24','optionA',421) ;
SELECT ts.date,ts.option_field,ts.value FROM( SELECT s.date,s.option_field,s.value,WEEK(s.date)AS week_no,MAX(DAYOFMONTH(s.date))as day_no 从test.stack s GROUP BY s.option_field,week_no )AS ts ;
PS:我没有检查过性能
答案 1 :(得分:0)
我会使用组和顺序函数,例如:
select
week(table1.date), table1.date, table1.option, table1.value
from
table1
group by week(date) , table1.option
order by date desc;
答案 2 :(得分:0)
我在辅助频道上找到了所需的解决方案,所以这里是:
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
行将该行记录在帐户中。