我有一个名为all_data的表,其中包含字段日期,值和其他字段。
我需要从数据库中选择最后7天,14天和30天。可以有几个条目具有相同的日期,如
date value
10-25-16 30
10-25-16 24
10-26-16 42
以下是我所拥有的SELECT Statment,工作时间不到30天
$sql = "SELECT type_entry, COUNT(value) as val_count, FLOOR(SUM(value)) as sum_glu FROM all_data
WHERE DATEDIFF(NOW(), date) < 30 AND type_entry = 'Glucose'
ORDER BY date";
我想要同样的查询2次,但是用&lt; 14和&lt; 7更改DATEDIFF语句所以我最终得到了val_count1,val_count2,val_count3,sum_glu1,sum_glu2,sumglu3我会用它来计算每个的平均值
我不太了解SQL如何去做。
以下是读数示例
10/17/2016 116
10/17/2016 277
10/17/2016 145
10/18/2016 150
10/18/2016 125
10/19/2016 200
我需要从2016年10月19日开始的7天的记录数量,然后我可以每周平均读数。
答案 0 :(得分:1)
您可以在此处使用条件聚合:
SELECT type_entry,
SUM(CASE WHEN DATEDIFF(NOW(), date) < 30 THEN 1 ELSE 0 END) AS val_count_30,
FLOOR(SUM(CASE WHEN DATEDIFF(NOW(), date) < 30 THEN value ELSE 0 END)) AS sum_glu_30,
SUM(CASE WHEN DATEDIFF(NOW(), date) < 14 THEN 1 ELSE 0 END) AS val_count_14,
FLOOR(SUM(CASE WHEN DATEDIFF(NOW(), date) < 14 THEN value ELSE 0 END)) AS sum_glu_14,
SUM(CASE WHEN DATEDIFF(NOW(), date) < 7 THEN 1 ELSE 0 END) AS val_count_7,
FLOOR(SUM(CASE WHEN DATEDIFF(NOW(), date) < 7 THEN value ELSE 0 END)) AS sum_glu_7
FROM all_data
WHERE type_entry = 'Glucose'
ORDER BY date
如果您只想在value
开始的7天内10/19/2016
的平均时间为7天,那么您可以使用WHERE
条款:
SELECT type_entry,
AVG(value) AS avgValue
FROM all_data
WHERE date BETWEEN '2016-10-19' AND DATE_ADD('2016-10-19', INTERVAL 7 DAY) AND
type_entry = 'Glucose'
GROUP BY type_entry
答案 1 :(得分:0)
基本上,您可以检索标准为< 30
的所有行,并且所有以下标准都包含在此标准中。您可以在聚合函数中添加CASE
表达式,以仅在符合条件的行中执行聚合。我所做的只是更改了每对列的< X
:
SELECT
type_entry,
COUNT(CASE WHEN DATEDIFF(NOW(), date) < 30 THEN value END) as val_count1,
FLOOR(SUM(CASE WHEN DATEDIFF(NOW(), date) < 30 THEN value END)) as sum_glu1,
COUNT(CASE WHEN DATEDIFF(NOW(), date) < 14 THEN value END) as val_count2,
FLOOR(SUM(CASE WHEN DATEDIFF(NOW(), date) < 14 THEN value END)) as sum_glu2,
COUNT(CASE WHEN DATEDIFF(NOW(), date) < 7 THEN value END) as val_count3,
FLOOR(SUM(CASE WHEN DATEDIFF(NOW(), date) < 7 THEN value END)) as sum_glu3
FROM all_data
WHERE DATEDIFF(NOW(), date) < 30 AND type_entry = 'Glucose'
GROUP BY type_entry
ORDER BY date
另外,请注意我添加了缺少的GROUP BY
子句。即使MySQL允许它,许多不同的数据库也会产生错误。推荐的方法是不要依赖MySQL机制。