2015-02-23 79 views
0

我有一个表格,用于记录来自不同营销渠道(SEM,SEO,Facebvook ...)的营销结果的数据。当我添加一条新数据时,我将记录该频道,它所指的日期,进行了多少销售以及何时输入了该数据(last_update)。由于设置方式的不同,可能需要返回并编辑之前日期的销售数量。我目前不想覆盖过去的数据,而是将更新作为新行插入。这里下面是DB计划:当每个日期有多个值时,MySQL:MAX(日期)

ID(INT)
通道(small_int)
日期(以unix_time格式日期)
销售(medium_int)
LAST_UPDATE(在unix_time格式日期)

如何我是否能够提取:
- 每天只有每个频道的latest_update?
- 与以上相同,但在过去的某个日期(即让我想象一下,我希望看到1月份的数据不像现在这样,但是最迟在2月1日进入)?

回答

0

解决此问题的最佳方法是使用WINDOW FUNCTIONS,但MySQL不提供对它们的支持,因此需要进行破解。

id字段是一个外键还是一个无意义的代理键,用于标识每一行?我会假设(因为你正在使用MySQL)答案是YES。

SELECT 
    id, 
    channel, 
    date, 
    sales, 
    last_update 
FROM 
    my_table a  
JOIN 
    (
     SELECT 
     channel, 
     date, 
     MAX(last_update) 
     FROM 
     my_table 
     GROUP BY 
     channel, 
     date 
    ) b 
     ON a.channel = b.channel 
     and a.date = b.date 
     and a.last_update = b.last_update; 

您可以使用此查询创建一个视图。

OBS:如果列标识是无意义且无用的主键,则应该使用date,channel和last_updated列创建适当的主键。此外,您应该避免使用日期作为列名,因为它是保留字,last_updated应该从日期到日期更改。

0

在某些伪代码中:选择last_update = MAX(last_update)的记录。特别是,

SELECT * 
FROM mytable mt1 
WHERE mt1.last_update = (
    SELECT MAX(mt2.last_update) 
    FROM mytable mt2 
    WHERE mt1.channel = mt2.channel 
     AND mt2.last_update <= '2015-02-01' 
    LIMIT 1 
) 

我认为每个channel,可能有两个记录具有相同last_update(即一对(channel, last_update)不是唯一的)。所以LIMIT 1选择一个任意一个。