mysql 排名 求和,MySQL top-N排名,然后将同一组的其余部分求和

I've researched most of the time with this topic, however I couldn't get a efficient and perfect answer regarding ranking (top 3) a MySQL table with group and aggregate using sum() to the rest.

The data are as following:

TS | Name | Count

=============================

1552286160 | Apple | 7

1552286160 | Orange | 8

1552286160 | Grape | 8

1552286160 | Pear | 9

1552286160 | Kiwi | 10

...

1552286100 | Apple | 10

1552286100 | Orange | 12

1552286100 | Grape | 14

1552286100 | Pear | 16

1552286100 | Kiwi | 9

...

1552286040 | Apple | 4

1552286040 | Orange | 2

1552286040 | Grape | 3

1552286040 | Pear | 7

1552286040 | Kiwi | 9

...

With this dataset, I would like to form Top 3 by each TS group, and 1 row with sum(Count) of the rest that group, like following:

TS | Name | Count

=============================

1552286160 | Kiwi | 10

1552286160 | Pear | 9

1552286160 | Grape | 8

1552286160 | Other | 8 + 7

...

1552286100 | Pear | 16

1552286100 | Grape | 14

1552286100 | Orange | 12

1552286100 | Other | 10 + 9

...

1552286040 | Kiwi | 9

1552286040 | Pear | 7

1552286040 | Apple | 4

1552286040 | Other | 3 + 2

...

The closest hint is actually provided via http://www.silota.com/docs/recipes/sql-top-n-aggregate-rest-other.html However, the solution was just for a single group.

The SQL Fiddle that I've prepared is located here: http://sqlfiddle.com/#!9/3cedd0/10

Appreciate if there's any solutions.

解决方案DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table

(ts INT NOT NULL

,name VARCHAR(12) NOT NULL

,count INT NOT NULL

,PRIMARY KEY(ts,name)

);

INSERT INTO my_table VALUES

(1552286160,'Apple' , 7),

(1552286160,'Orange', 8),

(1552286160,'Grape' , 8),

(1552286160,'Pear' , 9),

(1552286160,'Kiwi' ,10),

(1552286100,'Apple' ,10),

(1552286100,'Orange',12),

(1552286100,'Grape' ,14),

(1552286100,'Pear' ,16),

(1552286100,'Kiwi' , 9),

(1552286040,'Apple' , 4),

(1552286040,'Orange', 2),

(1552286040,'Grape' , 3),

(1552286040,'Pear' , 7),

(1552286040,'Kiwi' , 9);

SELECT ts

, CASE WHEN i>3 THEN 'other' ELSE name END name

, SUM(count) count

FROM

( SELECT x.*

, CASE WHEN @prev=ts THEN @i:=@i+1 ELSE @i:=1 END i

, @prev:=ts

FROM my_table x

, (SELECT @prev:=null,@i:=0) vars

ORDER

BY ts

, count DESC

, name

) a

GROUP

BY ts

, CASE WHEN i>3 THEN 'other' ELSE name END;

+------------+--------+-------+

| ts | name | count |

+------------+--------+-------+

| 1552286040 | Apple | 4 |

| 1552286040 | Kiwi | 9 |

| 1552286040 | other | 5 |

| 1552286040 | Pear | 7 |

| 1552286100 | Grape | 14 |

| 1552286100 | Orange | 12 |

| 1552286100 | other | 19 |

| 1552286100 | Pear | 16 |

| 1552286160 | Grape | 8 |

| 1552286160 | Kiwi | 10 |

| 1552286160 | other | 15 |

| 1552286160 | Pear | 9 |

+------------+--------+-------+

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值