昨晚为了让学弟认识到自己的 sql 水平,出题为难了他

2017-12-10 14:44:03 +08:00
 noNOno

--.结果我自己没有想出来好的写法 数据库 mysql

订单表有 3 列
|城市|商品|订单金额|

1.求每个城市[销量]前三的商品

在 mysql 查询,可以一个 sql 做到么

7943 次点击
所在节点    程序员
52 条回复
noNOno
2017-12-10 15:39:46 +08:00
我分享下自己的增量思路,不做伸手党.....
同时求好的思路.

----订单增量统计
每日增量统计销量,销量存入商品宽表
|城市|商品|销量|日期|
|武汉|切糕|1|2017-12-09|
|武汉|切糕|0|2017-12-10|

从商品宽表计算每月销量,按[日期月份]分组,聚合 sum([销量])
ToTChowChow
2017-12-10 15:46:51 +08:00
你需要 Leetcode sql
swulling
2017-12-10 15:55:07 +08:00
你这种无论如何都要扫全表的,用 SQL 没有意义啊,随便用 Python、PHP 这种外部分析好了

但是现实中,一般是两种方法:
1. 时效性低:外置定时任务扫描,增量简单,根据日期分析即可
2. 时效性高:kv 数据库存储,比如 Redis,也数据入库时,同时写入 Redis,然后用 Rank 就好了
noNOno
2017-12-10 16:01:54 +08:00
@swulling 索引就可以避免全表扫描了...打扰了
noNOno
2017-12-10 16:02:29 +08:00
下沉了.....
Weny
2017-12-10 16:36:40 +08:00
学弟怕是外包月入过十万 学长还是太年轻
wujichao
2017-12-10 16:56:33 +08:00
@swulling 请问这样的知识哪里可以学到完整的呢, 新手入门后端, 有些生产上的知识找不到书来学习
Seddas
2017-12-10 17:33:23 +08:00
Seddas
2017-12-10 17:36:38 +08:00
这种题 SQL 很熟的人也要想一阵好伐,而且真是很大的表执行速度肯定感人
xierch
2017-12-10 17:44:41 +08:00
data warehouse 那门课好多这种题目…
不过那时候是先把数据导入到某个专门用于分析的数据库( OLTP -> OLAP ),然后再用 MDX 写查询语句的…
https://en.wikipedia.org/wiki/Online_analytical_processing
https://en.wikipedia.org/wiki/MultiDimensional_eXpressions
jhdxr
2017-12-10 17:54:40 +08:00
只是想要实现目标的话还是有解的,先一个子查询根据城市统计出总额,然后找这个子查询中的记录,满足条件『金额大于等于当前记录的金额的条数小于等于 3 』即可

但考虑到 MySQL 极其糟糕的查询分析器,这种东西只能是写着玩。。。
noNOno
2017-12-10 19:53:20 +08:00
@Seddas 很多回答都看得很尴尬...都是不懂的人在回答
@xierch 这个其实就是 dw&dm 层的增量...OLTP ,OLAP 就是数仓要开发的东西.....导入进去...懵逼..

帖子怎么还没沉..
noNOno
2017-12-10 19:56:30 +08:00
@jhdxr 是的-.-,都没幽默感......我的尴尬癌都犯了
noNOno
2017-12-10 19:59:54 +08:00
@jhdxr 而且,你没有考虑到分组的情况,从子查询取『金额大于等于当前记录的金额的条数小于等于 3 』时,子查询中还包含了多个城市的多个商店.而要取每个城市的 top3,或 top30% .哈哈哈哈
qiukun
2017-12-10 22:14:54 +08:00
@noNOno 索引还能顾及 partition ?
yuriko
2017-12-10 22:37:42 +08:00
这个如果没啥特殊的要求,单纯的累加子查询,貌似就是我们以前上课作业的难度……
可惜这之后再也咩用过,已经忘干净了
noNOno
2017-12-10 22:38:38 +08:00
@qiukun 从订单表抽取时根据 updatetime 抽取,updatetime 加索引就好了.根本没有全表扫描的.
因为订单表的数据是金额,并不是销量,所以增量统计一定时间间隔的销量,
比如一天,将每天的销量放入宽化处理的 dw 表中,供 dm 层计算指标使用
不明白 partition 是指什么
noNOno
2017-12-10 22:39:51 +08:00
@yuriko 业务逻辑很复杂.
仔细看题...
swulling
2017-12-10 23:14:10 +08:00
@noNOno 你这个题怎么加索引都要扫全表的

一条订单一个记录,你不扫全表怎么算出某个商品的订单总额?

你别告诉我你每条记录直接就是商品在一个城市的订单总金额,那表名就不应该是 订单表
ooTwToo
2017-12-10 23:36:59 +08:00
这种聚合统计 es 应该比较专业。或者使用一张销售记录表,增量

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/413498

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX