我有两张桌子,SVISE和OVERW
在OVERW中,我有一些带有person I和得分日期的分数。E.g
p_id degrees mo_date
5 10.2 2013-10-09
5 9.85 2013-03-10
8 14.75 2013-04-25
8 11.00 2013-02-22
5 5.45 2013-08-11
5 6.2 2013-06-10SVISE.ofh字段必须使用最后三条记录的和更新(对于特定的人,按日期降序排序),因此对于id 5的人,和将由行产生。
5 10.2 2013-10-09
5 5.45 2013-08-11
5 6.2 2013-06-10sum=21.85。
基于以上值的SVISE,上的期望的最终结果:
HID OFH START
5 21.85 October, 16 2013 ##(10.2 + 5.45 + 6.2)
5 21.5 September, 07 2013 ##(5.45 + 6.2 + 9.85)
5 0 March, 05 2013 ##(no rows)
8 25.75 October, 14 2013 ##(14.75 + 11)
3 0 October, 14 2013 ##(no rows)
5 0 March, 05 2012 ##(no rows)OFH__was 0
我可以得到一个人的总金额,但我不能用极限来得到最后的3行。就会被忽视。
这是用于检索给定日期的每个人的所有学位的和的查询:
UPDATE SVISE SV
SET
SV.ofh=(SELECT sum(degrees) FROM OVERW WHERE p_id =SV.hid
AND date(mo_date)<date(SV.start)
AND year(mo_date)=year(SV.start))我不能只对sum使用限制:
UPDATE SVISE SV
SET
SV.ofh=(SELECT sum(degrees) FROM OVERW WHERE p_id =SV.hid
AND date(mo_date)<date(SV.start)
AND year(mo_date)=year(SV.start)
ORDER BY mo_date DESC
LIMIT 3)这不管用。
我已经尝试过使用multi-table updates和nested queries来实现这一目标。每个场景都有限制,阻碍了我完成所需的结果。
Unknown column 'SV.hid'in 'where clause'Incorrect usage of UPDATE and LIMIT任何解决办法都行。没有必要在一个查询中执行此操作。如果有人想试一试,即使是中间的桌子。
SQL小提琴也是可用的。
提前谢谢你的帮助。
-更新
下面是Akash的解决方案:http://sqlfiddle.com/#!2/4cf1a/1
发布于 2013-10-15 15:54:12
这应该能行,
更新了以使svice上有一个连接
UPDATE
svice SV
JOIN (
SELECT
hid,
start,
sum(degrees) as degrees
FROM
(
SELECT
*,
IF(@prev_row <> unix_timestamp(start)+P_ID, @row_number:=0,NULL),
@prev_row:=unix_timestamp(start)+P_ID,
@row_number:=@row_number+1 as row_number
FROM
(
SELECT
mo_date,
p_id,
hid,
start,
degrees
FROM
OVERW
JOIN svice sv ON ( p_id = hid
AND date(mo_date)<date(SV.start)
AND year(mo_date)=year(SV.start) )
ORDER BY
hid,
start,
mo_date desc
) sub_query1
JOIN ( select @row_number:=0, @prev_row:=0 ) sub_query2
) sub_query
where
row_number <= 3
GROUP BY
hid,
start
) sub_query ON ( sub_query.hid = sv.hid AND sub_query.start = sv.start )
SET
SV.ofh = sub_query.degrees注意:根据您更新的数据检查,由于日期条件的原因,所提供的测试数据无法产生您预期的结果。
发布于 2013-10-14 00:46:51
试一试
UPDATE svice SV
JOIN (SELECT SUM(degrees)sumdeg,p_id FROM(SELECT DISTINCT degrees,p_id FROM OVERW,svice WHERE OVERW.p_id IN (SELECT svice.hid FROM svice)
AND date(mo_date)<date(svice.start)
AND year(mo_date)=year(svice.start)ORDER BY mo_date DESC )deg group by p_id)bbc
ON bbc.p_id=SV.hid
SET
SV.ofh=bbc.sumdeg where p_id =SV.hid http://sqlfiddle.com/#!2/95b42/42
越走越近,现在“只”需要一个限制。
发布于 2013-10-15 16:51:09
两个假设:
然后你就能做到-
SELECT p_id
, SUM(degrees) ttl
FROM
( SELECT x.*
FROM overw x
JOIN overw y
ON y.p_id = x.p_id
AND y.mo_date >= x.mo_date
GROUP
BY p_id
, mo_date HAVING COUNT(*) <= 3
) a
GROUP
BY p_id;https://stackoverflow.com/questions/19351949
复制相似问题