MYSQL变量限制和子查询
我对mysql版本14.14发行版5.5.35上的mysql查询有一个问题: 我有一个名为mytable的表,有3列date、value和id\u patient 对于每一行,我需要知道前4个值的总和不为nullMYSQL变量限制和子查询,mysql,variables,subquery,Mysql,Variables,Subquery,我对mysql版本14.14发行版5.5.35上的mysql查询有一个问题: 我有一个名为mytable的表,有3列date、value和id\u patient 对于每一行,我需要知道前4个值的总和不为null SELECT @date:=date, value, ( SELECT SUM(value) FROM mytable WHERE date<@date AND id_patient=87321 AND value
SELECT @date:=date, value,
( SELECT SUM(value)
FROM mytable
WHERE date<@date
AND id_patient=87321
AND value IS NOT NULL
ORDER BY date DESC LIMIT 0,4 ) somme
FROM mytable
WHERE id_patient=87321
感谢您的帮助:在限制结果之前,所有行上的总和都已发生。在使用另一个子查询应用sum函数之前,首先限制结果
通过自连接和聚合:
select m.date, m.id_patient, m.value,
sum(mm.value) somme
from mytable m left join mytable mm
on mm.id_patient = m.id_patient and mm.value is not null and mm.date < m.date
and (
select count(*) from mytable
where id_patient = m.id_patient and value is not null
and date >= mm.date and date < m.date
) <= 4
where m.id_patient = '87321'
group by m.date, m.id_patient, m.value
谢谢你的回答。不幸的是,我已经尝试过了,但子查询中的日期变量似乎没有改变,因为我对每一行都有相同的结果…@FranckBarlet,我认为您试图用相同的总和值显示这4天,请尝试更新的答案否,结果不是等待结果。。。它只返回4行相同的总和。。。这个查询会杀了我:信息:我在帖子中添加了等待结果示例。我认为子请求是首先执行的。因此@date变量此时没有任何值…请参阅:。另外,我不熟悉“等待结果”这个词。谢谢你的评论。我已经编辑了我的帖子,并更改了术语“等待结果”。对不起,我的英语不好。。。我希望会好些。一定要在最后几天吗?只有4天,还是最近?总的目标是什么?只有4个。如果一个患者的就诊间隔几天,那么4天的确认时间是多少?您的MySql版本是什么?我需要将当天的值与值之和进行比较前4天的一个非零值。例如:我将2019-11-28的值与2019-11-27和2019-11-24 4天之间的值之和进行比较,因为每个值都不为空。但是对于2019-11-25,我取2019-11-19 6天之间的值,因为我有2个空值,我希望我的解释很清楚。非常感谢您提供此解决方案。这是一个伟大的方式去!
+-------------+--------------------+--------+
| @date:=date | value | somme |
+-------------+--------------------+--------+
| 2019-11-17 | 6 | NULL | SUM OF 0 previous values not null
| 2019-11-18 | 1 | 6 | SUM OF 1 previous values not null
| 2019-11-19 | 2 | 7 | SUM OF 2 previous values not null
| 2019-11-20 | NULL | 9 | SUM OF 3 previous values not null
| 2019-11-21 | 5 | 9 | SUM OF 4 previous values not null
| 2019-11-22 | 8 | 14 | SUM OF 4 previous values not null
| 2019-11-23 | NULL | 16 | SUM OF 4 previous values not null
| 2019-11-24 | 3 | 16 | SUM OF 4 previous values not null
| 2019-11-25 | 4 | 18 | SUM OF 4 previous values not null
| 2019-11-26 | 6 | 20 | SUM OF 4 previous values not null
| 2019-11-27 | 1 | 21 | SUM OF 4 previous values not null
| 2019-11-28 | 10 | 14 | SUM OF 4 previous values not null
+-------------+--------------------+--------+
SELECT @date:=date, value,
(SELECT sum(value) from
(SELECT value
FROM mytable
WHERE date<@date
AND id_patient=87321
AND value IS NOT NULL
ORDER BY date DESC LIMIT 0,4))
FROM mytable
WHERE date<@date
AND id_patient=87321
AND value IS NOT NULL
ORDER BY date DESC LIMIT 0,4
select m.date, m.id_patient, m.value,
sum(mm.value) somme
from mytable m left join mytable mm
on mm.id_patient = m.id_patient and mm.value is not null and mm.date < m.date
and (
select count(*) from mytable
where id_patient = m.id_patient and value is not null
and date >= mm.date and date < m.date
) <= 4
where m.id_patient = '87321'
group by m.date, m.id_patient, m.value
| date | id_patient | value | somme |
| ---------- | ---------- | ----- | ----- |
| 2019-11-17 | 87321 | 6 | |
| 2019-11-18 | 87321 | 1 | 6 |
| 2019-11-19 | 87321 | 2 | 7 |
| 2019-11-20 | 87321 | | 9 |
| 2019-11-21 | 87321 | 5 | 9 |
| 2019-11-22 | 87321 | 8 | 14 |
| 2019-11-23 | 87321 | | 16 |
| 2019-11-24 | 87321 | 3 | 16 |
| 2019-11-25 | 87321 | 4 | 18 |
| 2019-11-26 | 87321 | 6 | 20 |
| 2019-11-27 | 87321 | 1 | 21 |
| 2019-11-28 | 87321 | 10 | 14 |