MySQL:MAX(日期),每个日期有多个值

时间:2015-02-23 19:52:45

标签: mysql

我有一张表格,其中记录了来自不同营销渠道(SEM,SEO,Facebvook ......)的营销结果数据。当我添加新的数据时,我将记录频道,它引用的日期,销售的数量以及输入此数据的时间(last_update)。由于设置方式,可能必须返回并编辑之前日期的销售数量。我目前不想覆盖过去的数据,而是将更新作为新行插入。以下是DB方案:

id(int)
channel(small_int)
date(以unix_time格式表示的日期)
销售额(medium_int)
last_update(以unix_time格式表示日期)

我如何能够提取:
- 每天只为每个频道提供latest_update吗? - 与上述相同,但是在过去的某个日期(即我们想象一下,我想看看1月份的数据不是现在的情况,但最近在2月1日进入)?

2 个答案:

答案 0 :(得分:0)

解决此问题的最佳方法是使用WINDOW FUNCTIONS,但MySQL不提供支持,因此需要黑客攻击。

id字段是外键还是无意义的代理键,用于标识每一行?我想(因为你使用的是MySQL)答案是肯定的。

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:如果列id是无意义且无用的主键,则应创建一个包含date,channel和last_updated列的正确主键。此外,您应该避免使用日期作为列名,因为它是一个保留字,并且last_updated应该从日期更改为日期。

答案 1 :(得分: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选择任意一个。