楼主: angel19870912
13484 6

[问答] 求一SQL语句:两次购买时间间隔 [推广有奖]

  • 0关注
  • 1粉丝

大专生

78%

还不是VIP/贵宾

-

威望
0
论坛币
23 个
通用积分
3.0000
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
674 点
帖子
37
精华
0
在线时间
68 小时
注册时间
2010-10-1
最后登录
2019-12-1

相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
表结构:(字段为用户的交易记录:用户名称,交易时间)
userdate

10001

2014/6/1

10001

2014/9/1

10002

2014/5/20

10002

2014/7/1

10002

2014/8/1

10002

2014/9/1

10002

2014/9/12

10002

2014/9/16

10002

2014/9/30

10002

2014/10/21

10003

2014/9/1

10004

2014/9/1

10005

2014/9/1

10006

2014/6/1

10006

2014/8/21

10006

2014/9/1

10007

2014/6/15

10007

2014/6/21

10007

2014/8/30

10007

2014/9/1

10008

2014/9/1

10009

2014/7/4

10009

2014/8/15

10009

2014/9/1

10010

2014/9/1



如何用SQL语句实现:统计同一个用户,第一,二次成功购买的时间间隔天数.
多于两条交易记录的只需算第一次和第二次购买的时间间隔,只有一条交易记录的用户直接略去
最后查询希望得到的结果是:时间间隔天数=第二次交易时间-第一次交易时间
user购买间隔天数

10001

92

10002

42

10006

81

10007

6

10009

42

10010

92

10011

92

10012

42

10016

92

10017

6

10019

42

10020

92

10021

92

10022

21

10026

92

10029

42

10030

92

如果直接求不出来或比较麻烦,也可以是从数据表中取出同一用户前两条交易记录,最后查询的结果示例
userdate

10001

2014/6/1

10001

2014/9/1

10002

2014/5/20

10002

2014/7/1

10006

2014/6/1

10006

2014/8/21

10007

2014/6/15

10007

2014/6/21

10009

2014/7/4

10009

2014/8/15

或者这样的结果示例:
userdate

10001

2014/6/1

10001

2014/9/1

10002

2014/5/20

10002

2014/7/1

10003

2014/9/1

10004

2014/9/1

10005

2014/9/1

10006

2014/6/1

10006

2014/8/21

10007

2014/6/15

10007

2014/6/21

10008

2014/9/1

10009

2014/7/4

10009

2014/8/15

10010

2014/9/1

每个用户的交易数据条数没有规律,希望牛人指点啊,非常感谢
希望有牛人也可以提供下面这个问题的SQL语句,非常感谢
问题:数据表还是上表,求所有的间隔天数的SQL语句,即:如果一个用户有3条交易记录,间隔天数就有2个,第三次-第二次,第二次-第一次;如果一个用户只有1条记录,没有间隔天数,如果一个用户5条记录,4个间隔天数。






二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:sql语句 时间间隔 sql User 交易时间 记录 如何 统计 用户

沙发
brown10 发表于 2015-1-17 18:53:15 |只看作者 |坛友微信交流群
使用row_number即可
我用sql server写了一个 你看看ok不?
select A.[user],
DATEDIFF( Day,A.[date],B.[date]) as interval
from
( SELECT [user]
      ,[date]
      , ROW_NUMBER() over(partition by [user] order by [date] asc) as num
FROM [test].[dbo].[Table1] ) A
left outer join
(SELECT [user]
      ,[date]
      , ROW_NUMBER() over(partition by [user] order by [date] asc) as num
FROM [test].[dbo].[Table1] ) B
on A.[user]=B.[user]
where A.num=1
and B.num=2

使用道具

藤椅
angel19870912 发表于 2016-3-17 16:46:35 |只看作者 |坛友微信交流群
谢谢
这个代码只能求第一次和第二次之间的间隔,每个会员的购买次数是不均等的,不能一次性全求出来吗?

使用道具

板凳
星星飞翔 发表于 2016-7-6 15:41:42 |只看作者 |坛友微信交流群
brown10 发表于 2015-1-17 18:53
使用row_number即可
我用sql server写了一个 你看看ok不?
select A.,
我也在面临同样的难题,我试了您的SQL,可是不知道为什么,我的数据库显示cann't support,可能不支持rou_number和join同时使用吧,不知道还有没有其他的办法可以求出来??恳请赐教!!

使用道具

报纸
男孩泪 发表于 2016-8-12 10:32:14 |只看作者 |坛友微信交流群
create table card_PurchaseInterval as
select
a.card_num,
DATEDIFF(a.day,b.day) as interval
from
(select
card_num,day,
row_number() over(partition by (card_num) order by day asc) as num
from
user.Larage_Table
where length(card_num)=16 and card_num like '9%' ) a
left outer join
(select
card_num,day,
row_number() over(partition by (card_num) order by day asc) as num
from
user.Larage_Table
where length(card_num)=16 and card_num like '9%') b
on
a.card_num=b.card_num
where a.card_num=1 and b.card_num=2
各位帮忙看看,为什么去出来的数为0行呢

使用道具

地板
ウ兴ウ 发表于 2016-11-22 10:44:57 |只看作者 |坛友微信交流群
SELECT ACC_NBR ,LOGIN_TIME ,rn = ROW_NUMBER()OVER(PARTITION BY ACC_NBR ORDER BY LOGIN_TIME)
INTO #temp_behavior
FROM ECH_LLS.dbo.TM_MOBILE_LOGIN_201604

SELECT a.ACC_NBR,datediff(MINUTE,a.LOGIN_TIME,b.LOGIN_TIME)AS 时间间隔
FROM #temp_behavior a,#temp_behavior b
WHERE a.ACC_NBR = b.ACC_NBR AND a.rn + 1 = b.rn  

使用道具

7
yongyitian 发表于 2017-4-5 22:05:23 |只看作者 |坛友微信交流群
  1. /* Using SAS Proc SQL to get the results for the final question */

  2. data table1;
  3. input user_id:  dd $10.;
  4.   date=mdy(scan(dd,2,"/"), scan(dd,1,"/"), scan(dd,3,"/"));
  5. format date yymmdd10.;
  6. drop dd;
  7. datalines;
  8. 10001 01/06/2014
  9. 10001 01/09/2014
  10. 10002 20/05/2014
  11. 10002 01/07/2014
  12. 10002 01/08/2014
  13. 10002 01/09/2014
  14. 10002 12/09/2014
  15. 10002 16/09/2014
  16. 10002 30/09/2014
  17. 10002 21/10/2014
  18. 10003 01/09/2014
  19. 10004 01/09/2014
  20. 10005 01/09/2014
  21. 10006 01/06/2014
  22. 10006 21/08/2014
  23. 10006 01/09/2014
  24. 10007 15/06/2014
  25. 10007 21/06/2014
  26. 10007 30/08/2014
  27. 10007 01/09/2014
  28. 10008 01/09/2014
  29. 10009 04/07/2014
  30. 10009 15/08/2014
  31. 10009 01/09/2014
  32. 10010 01/09/2014
  33. ; run;

  34. proc sql;
  35.    create table table2 (drop = nn) as
  36.    select user_id, date, monotonic() as nn,  
  37.           calculated nn  - min(calculated nn ) +1 as gseq
  38.    from table1
  39.    group by user_id
  40.    order by user_id, date, gseq;
  41. quit;

  42. proc sql;
  43.    create table want(drop=gseq b_seq) as
  44.     select a.user_id, a.gseq, a.date as start_date,
  45.            b.user_id as _user, b.gseq as b_seq,
  46.            b.date as end_date, b.date-a.date as days
  47.     from table2 a, table2 b
  48.       where a.user_id = b.user_id and a.gseq+1=b.gseq;
  49. quit;

  50. proc print data=want; title 'want'; run; title;
复制代码


SQL Count Days.PNG

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-19 17:11