忆之独秀    https://blog.csdn.net/lavorange/article/details/25004181
这两天在参加阿里大数据竞赛,进入第二赛季要用到不少的SQL语句,现在才发现当时的数据库是白学了,今天就根据具体的需求来整理一下。可以把需求整理成为一道简单的题目,题目如下:

给定一个表t_alibaba_data:

user_id    brand_id    type    visit_datetime
10944750    13451    0    0604
10944750    13451    2    0604
10944750    13451    2    0723
10944750    13451    0    0801
10944750    13451    0    0515
10944750    13451    0    0703
10944750    13451    0    0629
10944750    13451    0    0814
10944750    21110    0    0422
10944750    1131    0    0713
…    …    …    …
其中:user_id代表用户,brand_id代表品牌,type代表操作的类型(0-点击,1-购买,2-收藏,3-购物车),visit_datetime即用户对品牌行为的时间(0415-0515,0516-0615,0616-0715,0716-0815四个月)。假设一共有10000条交易记录。
现在有这样的需求即:我现在需要对用户user_id对某一个品牌brand_id进行评分grade(可以理解为用户对品牌的喜爱程度),评分grade规则为用户对品牌不同类型type=0,1,2,3的操作总数,然后给这些总数乘以相应的权值grade = w0*count(type=0) + w1*count(type=1) + w2*count(type=2)+w3*count(type=3)。当然考虑到时间的因素,可以对靠后时间的点击操作提高权重,相对距离较远的点击操作降低权重,那么w0*count(type=0)可以改写成

w0*( 1*count(type=0 and 0716<=visit_datatime<=0815) + 0.8*count(type=0 and 0616<=visit_datatime<=0715) +

0.6*count(type=0 and 0516<=visit_datetime<=0615)  + 0.4*count(type=0 and 0415<=visit_datetime<=0515)).现在就是要创建一个表user_brand_grade<user_id,brand_id,grade>,按照grade降序排列以便找到前1000个<user_id,brand_id>对。

Step1:首先不考虑时间的因素,首先要找到用户user_id对于某个品牌brand_id某种操作type=0/1/2/3的总次数。

SELECT user_id , brand_id , count(type=0) as type0 ,count(type=1) as type1 , count(type=2) as type2 ,count(type=3) as type3 FROM t_alibaba_data t
where visit_datetime >= 415 && visit_datetime <= 715
group by user_id,brand_id;

结果:

当我这么写完之后我发现type0,type1,type2,type3的值都是一样的。这非常不合理,才知道这么写是有问题的。
SQL语句count()的用法:http://www.w3school.com.cn/sql/sql_func_count.asp

可见count只能计算某一列的总数目,或者某一列符合一个条件的总数目,但不能计算某列符合多个条件的相应数目。

Step2:那么修改count成为sum加上type的条件可以做出相应的选择。

SELECT user_id , brand_id ,
sum(type=0) as type0,
sum(type=1) as type1,
sum(type=2) as type2,
sum(type=3) as type3
FROM t_alibaba_data t
where visit_datetime >=515 && visit_datetime <=815
group by user_id ,brand_id;

结果:

SQL语句sum()的用法:http://www.w3school.com.cn/sql/sql_func_sum.asp

sum中是可以加表达式的,因此可以加上type的相应值。

Step3:此时不禁要想,如果当type=0的时候,要根据visit_datetime选择不同的值怎么办?在此要用到case进行条件的选择。那么就可以重写Step2的SQL语句。

SELECT user_id , brand_id ,
sum(case when type=0 then 1 else 0 end) as type0,
sum(case when type=1 then 1 else 0 end) as type1,
sum(case when type=2 then 1 else 0 end) as type2,
sum(case when type=3 then 1 else 0 end) as type3
FROM t_alibaba_data t
group by user_id , brand_id ;

结果(应该和上图相同):

Step4:用case增加时间上的判断:

select * ,(type0+type1+type2+type3) as grade from (
SELECT user_id , brand_id ,
sum(casewhen type=0 && visit_datetime >= 801 && visit_datetime<=815 then 10when type=0 && visit_datetime >= 716 && visit_datetime<=731 then 8when type=0 && visit_datetime >= 701 && visit_datetime<=715 then 6when type=0 && visit_datetime >= 616 && visit_datetime<=630 then 4when type=0 && visit_datetime >= 601 && visit_datetime<=615 then 2when type=0 && visit_datetime >= 516 && visit_datetime<=531 then 1else 0end) as type0,
sum(case when type=1 then 1 else 0 end) as type1,
sum(case when type=2 then 2 else 0 end) as type2,
sum(case when type=3 then 3 else 0 end) as type3
FROM t_alibaba_data t
group by user_id , brand_id
order by type0 desc
)a
order by grade desc limit 1000;

然后得到结果:

那么就可以找到符合要求的<user_id,brand_id>对了,即最活跃的用户品牌对。

计算一列中某个值的个数相关推荐

  1. python数据按照分组进行频数_Pandas:按两列分组并计算第二列中所有值的出现次数...

    我相信您需要先替换所有值>=6,然后再替换groupby+aggregatesum:s = df['num ofcust'].mask(df['num ofcust'] >=6, '6+' ...

  2. pandas使用nunique函数计算dataframe每个数据列的独特值的个数(count number of unique values in each column of dataframe)

    pandas使用nunique函数计算dataframe每个数据列的独特值的个数(count number of unique values in each column of dataframe) ...

  3. excel中使用countif函数,计算一列数据的重复内容个数

    excel中使用countif函数,计算一列数据的重复内容个数 平常,在统计数据时,需要知道excel表格中某一列数据的每个内容的具体个数有多少,虽然可以通过写代码解决,但是对于没有代码基础的人来说有 ...

  4. R语言计算每一个数据列的独特值的个数(nunique)、每一个数据列的独特值(unique)

    R语言计算每一个数据列的独特值的个数(nunique).每一个数据列的独特值(unique) 目录

  5. oracle替换表merge,sql – Oracle – 如何使用merge根据其他表和列中的值更新列

    我想根据与其他列和其他表的值比较更新closed_date列中的值.我用Oracle合并到声明中.但它给了我一个错误: 错误:ORA-00969:缺少ON关键字 我不确定出了什么问题.我想念什么吗?以 ...

  6. 窗口分析函数_8_计算某列的中间值

    计算某列的中间值 需求描述 需求:计算EMP表按照deptno分组,找出排在中间的SAL 解决方法:通过窗口函数集合COUNT(*)通过序号取模来判断. 注: 数据库数据集SQL脚本详见如下链接地址 ...

  7. arcmap中使用python_ArcMap - 使用python更新列中的值

    概述:在外文网上,很多人都问在ArcMap中如何通过SQL修改属性字段的值,我见回答的人都说通过"Field Calculator",貌似不能直接通过SQL语句. 虽然学gis开发 ...

  8. MySQL查询某个列中相同值的数量统计

    前言 今天突然想到自己写的课表查询Api没有加统计功能,因此今天加上了统计,记录了请求的类型.事件和时间,等新学期到来的时候就能用上了,毕竟刚开学同学们还是比较在意这学期都有什么课的哈哈哈,而且也能够 ...

  9. Excel统计一列中某个值出现的次数

    背景 帮朋友统计腾讯问卷星上的回答,问卷星默认导出的值为数字,例如一个问题有ABCD四个选择,则各自对应数字1234,导出的Excel文件中第一行为问题,随后此列所有的值为对应的选项数字,需要自行通过 ...

最新文章

  1. java中class对象的理解 讲得相当不错 很接地气 引用下
  2. 孙正义万字访谈:AI是我现在唯一关注的事情,我是科技的绝对信徒
  3. 【C++】欧几里德算法快速求最大公约数
  4. python如何在循环中保存文件_python-如何在for循环中更改为另一行文件
  5. 开源怎么挣钱(转帖收藏)
  6. 自定义线程类中实例变量与其他线程共享与不共享
  7. 技术干货| 阿里云基于Hudi构建Lakehouse实践探索「内附干货PPT下载渠道」
  8. C#中实现QQ截图的功能及相关问题
  9. 利用Python求阶乘
  10. weka连接mysql数据库
  11. 苹果手机还原网络设置会怎样_如果你的苹果手机信号不好!要记得这样设置,让你信号轻松满格...
  12. windows 如何查看文件夹所使用的图标
  13. ORACLE数据文件系统只读(FC中断引起)转载【xiaoyu】
  14. AppCan学习笔记(2)-UI控件
  15. 线性回归实战:股价预测(未完)
  16. android 微博一键关注,新浪微博怎样一键关注多个好友
  17. php小写数字变成大写,php 小写数字怎么转大写
  18. 工作流应用 电子表单签核
  19. Java高级篇-----jdk1.8新特性
  20. 使用PyG (PyTorch Geometric) 实现同质图transductive链路预测任务

热门文章

  1. oracle 触发器 行级,oracle的行级触发器使用
  2. 安卓软件错误log_关于android程序的log错误信息的问题,请明白人看下吧,我是初学者,新建的android项目,一个代码都没改过...
  3. mat 内存分析 Linux,JVM内存分析工具MAT使用简介
  4. mysql忘记i密码_Mysql忘记密码处理过程
  5. Ubuntu安装包时报错 E:Unable to locate package xxx(如:python3-pip)
  6. 【探索篇】测试人员一直疏忽掉的测试用例点,你中枪了吗?
  7. django class类即视图类添加装饰器的几种方法
  8. LinkedList源码学习
  9. 获得网页中元素的位置
  10. Notepad++使用教程