求教各位,下面这个sql怎么写效率较高啊,主要是订单表真的很大!!!!
用户表:users (user_id int)
订单表:order_tb(user_id int, or_time date, or_money double)
求以下用户:
一月下过单,二月份没有下过单的三月份下单用户
的如下指标:
三月份订单金额大于100的订单数,三月份第一笔订单和最后一笔订单的订单金额。(每个用户的哦)
我一直都在奇怪,为什么订单表很大的公司,会找一个不懂得写SQL的人或者公司做软件?!
万一没打算用关系数据库呢
亲爱的大叔,进入一个订单表很大的公司一直是我的梦想呢!这不在好好学sql嘛,这是我从别处看来的一个题。能够问这个问题的人应该不是一个完全不懂sql的人吧!不是写不出来,只是很好奇高手会怎么解决这个问题!寻求更好的解决方法有什么不对的呢?大叔这样子回答肯定是身怀绝技的吧?还请大叔露两手呢!指点指点
@hongma: 订单小才写SQL,订单大就不写SQL了。
这种需求订单数越大,越不可能用SQL解决。
这种需求你能写出来的任何一句SQL都是低效的。
@爱编程的大叔: 不知道在订单表很大的公司如果不用sql,那会是个什么流程处理这种需求的呢?还请大叔不吝赐教
@hongma: 处理方式很多的
1、把提需求的产品经理祭天。
2、没法祭天,要求产品经理详细提供需求应用场景,使用频率,使用用户情况。
3、不要在你只有1万元的时候想象马云如何花钱,没有任何意义。你应该学习的是一万元的人如何花钱。
4、关于第二点,可以写3000到10000字详细分析。
5、然后才决定是否要开发这个需求。
最重要的一点,有的人把10万行订单数据,就叫数据量大,有的人把1000万行叫小数据量。
大、小这种出现在问题中,没有任何指导意义,这样提需求,就是只能扯淡的。
这个是练手的吧?针对你的这个需求没有哪种写法效率会高(除非你1,2,3月下单用户量极小)
嗯嗯是练手的呢!麻烦请教下:
select user_id
,first_value(ormoney) over(partition by user_id order by ortime) as first_or
,last_value(ormoney) over(partition by user_id order by ortime) as last_or
from order_tb
group by user_id
这个我想单纯求下用户最早和最晚订单的订单金额,老是报错not a GROUP BY expression。哪里有问题呢?要怎么写呢?
真心感谢!
@hongma: 用了group by前面要带你分组的参数名
@Drunk_fish: 分组的参数是指user_id吗?我select里面有select user_id啊!还请说得更详细点
@hongma: 你可以先吧下单的用户作为一个简单的视图,再去求一月份下单,二月份没下单,三月份下单的用户。
@Drunk_fish: 对,我觉得就是这样的
为什么总是想在一个sql中处理,除非你是金融业务跑报表,可以几个小时几个小时的跑,这种需求一般是所有字段加索引,分表,然后拆分需求,单条sql查询之后再程序里面处理
再用group by来限制条件就行了
要按月份分组,在用having限制条件就行了