我有一张表格,其中记录了来自不同营销渠道(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日进入)?
答案 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
选择任意一个。