首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用SUM和极限更新,滚动汇总

使用SUM和极限更新,滚动汇总
EN

Stack Overflow用户
提问于 2013-10-14 00:38:43
回答 4查看 214关注 0票数 7

我有两张桌子,SVISEOVERW

OVERW中,我有一些带有person I和得分日期的分数。E.g

代码语言:javascript
复制
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-10

SVISE.ofh字段必须使用最后三条记录的和更新(对于特定的人,按日期降序排序),因此对于id 5的人,和将由行产生。

代码语言:javascript
复制
5        10.2      2013-10-09
5        5.45      2013-08-11
5        6.2       2013-06-10

sum=21.85。

基于以上值的SVISE,上的期望的最终结果:

代码语言:javascript
复制
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行。就会被忽视。

这是用于检索给定日期的每个人的所有学位的和的查询:

代码语言:javascript
复制
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使用限制:

代码语言:javascript
复制
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 updatesnested queries来实现这一目标。每个场景都有限制,阻碍了我完成所需的结果。

  • 嵌套查询看不到父表。Unknown column 'SV.hid'in 'where clause'
  • 多表更新不能有限制地使用。Incorrect usage of UPDATE and LIMIT

任何解决办法都行。没有必要在一个查询中执行此操作。如果有人想试一试,即使是中间的桌子。

SQL小提琴也是可用的。

提前谢谢你的帮助。

-更新

下面是Akash的解决方案:http://sqlfiddle.com/#!2/4cf1a/1

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-10-15 15:54:12

这应该能行,

更新了以使svice上有一个连接

代码语言:javascript
复制
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

注意:根据您更新的数据检查,由于日期条件的原因,所提供的测试数据无法产生您预期的结果。

票数 3
EN

Stack Overflow用户

发布于 2013-10-14 00:46:51

试一试

代码语言:javascript
复制
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

越走越近,现在“只”需要一个限制。

票数 2
EN

Stack Overflow用户

发布于 2013-10-15 16:51:09

两个假设:

  1. 您可以知道如何将其转换为更新,并且
  2. PK存在于(id,mo_date)上

然后你就能做到-

代码语言:javascript
复制
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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19351949

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档