表
+------+-------+------------------+
|CLIENT| VALUE | DATETIME |
+------+-------+------------------+
| A | 1 | 2018-11-10 09:00 |
| B | 1 | 2018-11-10 09:00 |
| C | 1 | 2018-11-10 09:00 |
| D | 2 | 2018-11-10 08:00 |
| E | 2 | 2018-11-10 08:00 |
| F | 3 | 2018-11-10 08:00 |
| A | 1 | 2018-11-10 07:00 |
| B | 2 | 2018-11-10 07:00 |
| C | 2 | 2018-11-10 07:00 |
| D | 3 | 2018-11-10 06:00 |
| E | 1 | 2018-11-10 06:00 |
| F | 2 | 2018-11-10 06:00 |
| A | 1 | 2018-11-08 08:00 |
| B | 2 | 2018-11-08 08:00 |
| C | 2 | 2018-11-08 08:00 |
| D | 1 | 2018-11-08 08:00 |
| E | 1 | 2018-11-08 07:00 |
| F | 2 | 2018-11-08 07:00 |
我是mysql的新手,因此在查询中遇到麻烦。
我只有一个名为“ table”的表,其中包含三列。
此表每天在不同时间记录来自一组特定的客户端A,B,C,D,E,F的许多数据
对于一个查询,我需要创建一个新表,其中每个客户端一行,并包含以下4列:
我希望有人能帮助我。
我想收到的东西:
+------+-------------+-----------+--------------+--------------+
|CLIENT| NEWEST VALUE| LAST 24 H | LAST 7 DAYS | LAST 30 DAYS |
+------+-------------+-----------+--------------+--------------+
| A | 1 | 100% | 100% | ... |
| B | 1 | 50% | 66% | ... |
| C | 1 | 50% | 33% | ... |
| D | 2 | 0% | 33% | ... |
| E | 2 | 50% | 66% | ... |
| F | 3 | 0% | 0% | ... |
这段代码可以很好地创建“ NEWST VALUE”(新闻值)列
SELECT
client,
value,
max(datetime)
FROM
table
GROUP BY
client;
这将创建“ LAST 24 H”列
SELECT
client,
count(if(value = 1,1, null))/count(value),
FROM
table
WHERE
date(datetime) < CURRENT_DATE() - interval 1 day
GROUP BY
repository_name;
但是我无法将所有输出放到一张新表中
答案 0 :(得分:0)
您可以使用条件聚合。假设使用8.0之前的MySQL,只有最新值确实很棘手。这是一种方法:
select t.client,
max(case when t.datetime = c.maxdt then t.value end) as most_recent_value,
avg(case when t.datetime >= now() - interval 1 day
then (t.value = 1)
end) as last_day_percentage,
avg(case when t.datetime >= now() - interval 7 day
then (t.value = 1)
end) as last_7day_percentage,
avg(case when t.datetime >= now() - interval 30 day
then (value = 1)
end) as last_30day_percentage
from t join
(select t.client, max(t.datetime) as maxdt
from t
group by t.client
) c
on c.client = t.client
group by t.client;
请注意,此逻辑使用MySQL扩展,其中布尔值在数字上下文中被视为数字,其中1表示true,0表示false。
平均值在所讨论的时间段内产生“ 0”或“ 1”,对于任何其他记录,其值为NULL
。 avg()
函数将忽略NULL
值。