0

我们有一个以这种方式列出选项更改的数据库表:

日期 | 选项 | 价值

08 年 1 月 7 日 | 选项A | 值_a

08 年 1 月 7 日 | 选项B | 值_b

2008 年 2 月 7 日 | 选项A | value_a2

我们假设在第一个有选项的日期之前(主键是日期和选项)没有设置选项。我们必须每天都这样做,每个选项之后都会覆盖以前的更改,但不能倒退。

我想知道如何加入此表,以便每周获得每个选项的最新值的完整值集。类似于以下内容:

日期 | 选项 | 价值

08 年 1 月 7 日 | 选项A | 值_a

08 年 1 月 7 日 | 选项B | 值_b

2008 年 2 月 7 日 | 选项A | value_a2

2008 年 2 月 7 日 | 选项B | 值_b

4

3 回答 3

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行。

于 2013-08-26T10:38:25.847 回答
0

我会使用 group 和 order 函数,例如:

select 
week(table1.date), table1.date, table1.option, table1.value
    from
table1
group by week(date) , table1.option
order by date desc;
于 2013-08-26T09:45:19.213 回答
0

希望我的问题是对的

CREATE TABLE test.stack ( 日期 DATE , option_field VARCHAR(50) , 值 INT(5) )

截断表 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 FROM 测试。 stack s GROUP BY s.option_field, week_no ) AS ts ;

PS:我没有检查性能

于 2013-08-26T09:35:49.547 回答