由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Database版 - 请教:找出10天内下了超过5次单的customers
相关主题
问一个数据处理的问题,该如何实现单列转多行?14楼有图更新 (转载)webbew SQL问题解法1 -- 90%以上的数据库版SQL问题可以用partition by解决
query analyzer VS. Stored procedure养老院人事 SQL难题解法综述 -- 申精
请教SQL server的一个programming的问题,谢谢求助一个MS SQL的问题。 关于SSRS的
问一个 SQL combine records问题a complex sql query, high hand help!!!
怎么在openquey里传变量.面试问题,关于oracle 8i
来做sql题目。老印给我的一个Challenge
webbew SQL问题解法2 -- SQL 利器Recursive CTE求教:数据操作
webbew SQL问题解法3 -- 还在远古时代总么办question: copy first N rows from table B to table A (DB2)
相关话题的讨论汇总
话题: 1900话题: 00话题: orderdate话题: 10话题: order
进入Database版参与讨论
1 (共1页)
l**n
发帖数: 264
1
MySQL下有表格:
CustomerID OrderDate
101 2014-12-11
102 2014-12-13
101 2014-12-14
103 2014-12-15
... ...
如果想找出m天内下了超过k次单的顾客,能不能不用sub query实现?
w****n
发帖数: 266
2
select custid
from yourtable
where sysdate-orderdate》m
group by custid
having count(custid)》k
tested in oracle

【在 l**n 的大作中提到】
: MySQL下有表格:
: CustomerID OrderDate
: 101 2014-12-11
: 102 2014-12-13
: 101 2014-12-14
: 103 2014-12-15
: ... ...
: 如果想找出m天内下了超过k次单的顾客,能不能不用sub query实现?

s**********o
发帖数: 14359
3
对的,如果这个简单的问题都不会,SQL基本就不怎么懂
还可以用PARTITION BY进行RANK,由高到低

【在 w****n 的大作中提到】
: select custid
: from yourtable
: where sysdate-orderdate》m
: group by custid
: having count(custid)》k
: tested in oracle

l**n
发帖数: 264
4
不是最近10天,是任何10天内

【在 w****n 的大作中提到】
: select custid
: from yourtable
: where sysdate-orderdate》m
: group by custid
: having count(custid)》k
: tested in oracle

l**n
发帖数: 264
5
有可能我没说清楚,不是最近10天,而是任何10天内
如果是最近10天内,那么这个很简单

【在 s**********o 的大作中提到】
: 对的,如果这个简单的问题都不会,SQL基本就不怎么懂
: 还可以用PARTITION BY进行RANK,由高到低

m******u
发帖数: 12400
6
LZ是个女的。既然都更新了,何不更准确点:应该是任意连续的m天。不是最近10天,
也不是任意10天,而是任意连续的10天。
是不太好做。哪位大拿做出来,请贴上来。
发信人: lvin (snake~), 信区: Database
标 题: Re: 请教:找出10天内下了超过5次单的customers
发信站: BBS 未名空间站 (Tue Oct 6 15:39:33 2015, 美东)
有可能我没说清楚,不是最近10天,而是任何10天内
如果是最近10天内,那么这个很简单
m******u
发帖数: 12400
7
要用到循环或cursors么?
B*****g
发帖数: 34098
8
方法一 selfjoin, join 10天之内的,然后count >=5。
方法二 partition by (LAG),找前面第5个,看时间是不是差是不是小于10天
由于机器人的要求是mysql,所以方法二不能使用
c*****d
发帖数: 6045
9
beijing说:任何语句都可以用partition实现
coolbid说:任何subquery都可以用join实现

【在 m******u 的大作中提到】
: LZ是个女的。既然都更新了,何不更准确点:应该是任意连续的m天。不是最近10天,
: 也不是任意10天,而是任意连续的10天。
: 是不太好做。哪位大拿做出来,请贴上来。
: 发信人: lvin (snake~), 信区: Database
: 标 题: Re: 请教:找出10天内下了超过5次单的customers
: 发信站: BBS 未名空间站 (Tue Oct 6 15:39:33 2015, 美东)
: 有可能我没说清楚,不是最近10天,而是任何10天内
: 如果是最近10天内,那么这个很简单

B*****g
发帖数: 34098
10
ding
再加一句,在mysql上还玩复杂sql的都是耍流氓

【在 c*****d 的大作中提到】
: beijing说:任何语句都可以用partition实现
: coolbid说:任何subquery都可以用join实现

相关主题
来做sql题目。webbew SQL问题解法1 -- 90%以上的数据库版SQL问题可以用partition by解决
webbew SQL问题解法2 -- SQL 利器Recursive CTE养老院人事 SQL难题解法综述 -- 申精
webbew SQL问题解法3 -- 还在远古时代总么办求助一个MS SQL的问题。 关于SSRS的
进入Database版参与讨论
c*****d
发帖数: 6045
11
select o1.CustomerID , COUNT(*)
from orders o1 join orders o2
on o1.CustomerID = o2.CustomerID
where o1. OrderDate > o2. OrderDate
and o1. OrderDate < o2. OrderDate+ 10
group by o1.CustomerID
having COUNT(*) > 5;
m******u
发帖数: 12400
12
不是任意subquery都能用join实现的。
m******u
发帖数: 12400
13
是不是要distinct一下。不然会重复选出一些customerid吧。select list 中的count
(*)可以去掉。
发信人: coolbid (Dreams bring hopes), 信区: Database
标 题: Re: 请教:找出10天内下了超过5次单的customers
发信站: BBS 未名空间站 (Tue Oct 6 16:04:11 2015, 美东)
select o1.CustomerID , COUNT(*)
from orders o1 join orders o2
on o1.CustomerID = o2.CustomerID
where o1. OrderDate > o2. OrderDate
and o1. OrderDate < o2. OrderDate+ 10
group by o1.CustomerID
having COUNT(*) > 5;
c*****d
发帖数: 6045
14
你能给我举出个不能实现的例子吗

【在 m******u 的大作中提到】
: 不是任意subquery都能用join实现的。
c*****d
发帖数: 6045
15
如果只是要找到这样的ID,加上distinct去掉重复的

count

【在 m******u 的大作中提到】
: 是不是要distinct一下。不然会重复选出一些customerid吧。select list 中的count
: (*)可以去掉。
: 发信人: coolbid (Dreams bring hopes), 信区: Database
: 标 题: Re: 请教:找出10天内下了超过5次单的customers
: 发信站: BBS 未名空间站 (Tue Oct 6 16:04:11 2015, 美东)
: select o1.CustomerID , COUNT(*)
: from orders o1 join orders o2
: on o1.CustomerID = o2.CustomerID
: where o1. OrderDate > o2. OrderDate
: and o1. OrderDate < o2. OrderDate+ 10

m******u
发帖数: 12400
16
你这个query是错的。我在adventureworks上试过了。找出的数据是错的。不是任意连
续10。原因可能是没join上。这里贴上customerid是11330的所有order。11330是你
query找出来的最前面的一位customer,你看他的order没有连续10天超过5个的。
11330 2007-11-17 00:00:00.000 2007-11-12 00:00:00.000
11330 2007-11-25 00:00:00.000 2007-11-17 00:00:00.000
11330 2007-11-25 00:00:00.000 2007-11-17 00:00:00.000
11330 2007-12-07 00:00:00.000 2007-12-06 00:00:00.000
11330 2007-12-17 00:00:00.000 2007-12-07 00:00:00.000
11330 2007-12-19 00:00:00.000 2007-12-17 00:00:00.000
11330 2008-01-10 00:00:00.000 2008-01-06 00:00:00.000
11330 2008-03-07 00:00:00.000 2008-02-27 00:00:00.000
11330 2008-05-02 00:00:00.000 2008-04-24 00:00:00.000
11330 2008-06-01 00:00:00.000 2008-05-22 00:00:00.000
11330 2008-06-03 00:00:00.000 2008-06-01 00:00:00.000
11330 2008-06-13 00:00:00.000 2008-06-03 00:00:00.000
11330 2008-06-16 00:00:00.000 2008-06-13 00:00:00.000
m******u
发帖数: 12400
17
上贴贴上的例子,漏了header。分别是:customerid, o1.orderdate, o2.orderdate
。可以看出没有连续10天超出5个order。
B*****g
发帖数: 34098
18
苦逼的大师group by时丢了一个

orderdate

【在 m******u 的大作中提到】
: 上贴贴上的例子,漏了header。分别是:customerid, o1.orderdate, o2.orderdate
: 。可以看出没有连续10天超出5个order。

m******u
发帖数: 12400
19
请问丢掉的是哪一个啥?
发信人: Beijing (我是猪,听说猪是被祝福的), 信区: Database
标 题: Re: 请教:找出10天内下了超过5次单的customers
发信站: BBS 未名空间站 (Tue Oct 6 16:46:25 2015, 美东)
苦逼的大师group by时丢了一个
B*****g
发帖数: 34098
20
group by o1.CustomerID, o1.orderdate

【在 m******u 的大作中提到】
: 请问丢掉的是哪一个啥?
: 发信人: Beijing (我是猪,听说猪是被祝福的), 信区: Database
: 标 题: Re: 请教:找出10天内下了超过5次单的customers
: 发信站: BBS 未名空间站 (Tue Oct 6 16:46:25 2015, 美东)
: 苦逼的大师group by时丢了一个

相关主题
a complex sql query, high hand help!!!求教:数据操作
面试问题,关于oracle 8iquestion: copy first N rows from table B to table A (DB2)
老印给我的一个Challengea simpler sQL question, high help please!!!!
进入Database版参与讨论
m******u
发帖数: 12400
21
加上这个之后只有一位11300的customer了。(在adventureworks2008r2,Sales.
SalesOrderHeader测试)
m******u
发帖数: 12400
22
该11300同学在2008-2-8 到2008-2-18间超过5个order,且只有这一次。
z0
发帖数: 71
23
select a.CustomerID ,
a.OrderDate ,
a.OrderID
from your_table a
join your_table b
on a.CustomerID = b.CustomerID
and a.OrderDate between b.OrderDate - 10 and b.OrderDate
group by 1,2,3
having count(1) >= 10 ;
l*********s
发帖数: 5409
24
sort the table based on ordering time, then check very other five records if
the period is less than 10 days.
c*****d
发帖数: 6045
25
确实少写了orderdate, 另外最后having count(*)不是5,是 5-1 = 4
select distinct o2.Customer_ID
from orders o1, orders o2
where o1.Customer_ID = o2.Customer_ID
and o1.order_date > o2.order_date
and o1.order_date <= o2.order_date + 10
group by o2.Customer_ID, o2.order_date
having COUNT(*) >= 4

【在 B*****g 的大作中提到】
: 苦逼的大师group by时丢了一个
:
: orderdate

c*****d
发帖数: 6045
26
a.orderID肯定不能出现在group by里,如果orderID是不重复的

【在 z0 的大作中提到】
: select a.CustomerID ,
: a.OrderDate ,
: a.OrderID
: from your_table a
: join your_table b
: on a.CustomerID = b.CustomerID
: and a.OrderDate between b.OrderDate - 10 and b.OrderDate
: group by 1,2,3
: having count(1) >= 10 ;

c*****d
发帖数: 6045
27
order by orderID, orderDate可以用SQL做
后面check every five records if period is less than 10 days怎么用SQL做?如果
不用PL/SQL游标的话

if

【在 l*********s 的大作中提到】
: sort the table based on ordering time, then check very other five records if
: the period is less than 10 days.

z****z
发帖数: 2054
28
根据lz的时间格式, 这个query会漏掉在同一天下的不同单子。

【在 c*****d 的大作中提到】
: 确实少写了orderdate, 另外最后having count(*)不是5,是 5-1 = 4
: select distinct o2.Customer_ID
: from orders o1, orders o2
: where o1.Customer_ID = o2.Customer_ID
: and o1.order_date > o2.order_date
: and o1.order_date <= o2.order_date + 10
: group by o2.Customer_ID, o2.order_date
: having COUNT(*) >= 4

B*****g
发帖数: 34098
29
我贴的方法2呀

【在 c*****d 的大作中提到】
: order by orderID, orderDate可以用SQL做
: 后面check every five records if period is less than 10 days怎么用SQL做?如果
: 不用PL/SQL游标的话
:
: if

B*****g
发帖数: 34098
30
机器人帖子大家太认真,嘿嘿

【在 z****z 的大作中提到】
: 根据lz的时间格式, 这个query会漏掉在同一天下的不同单子。
相关主题
Help on migrating oracle to db2, outerjoinquery analyzer VS. Stored procedure
query: in sql server 2005请教SQL server的一个programming的问题,谢谢
问一个数据处理的问题,该如何实现单列转多行?14楼有图更新 (转载)问一个 SQL combine records问题
进入Database版参与讨论
s**********o
发帖数: 14359
31
你先做个10天的表吧,从哪天开始到哪天结束,
先找到最开始的ORDER,总不可能是从1900开始吧,然后到最后的2015年
CALL STORED PROCEDURE PASS IN STARTDATE ENDDATE BY CURSOR
SP里,INSERT INTO A TABLE DISTINCT CUSTOMER_ID
虽然笨了点
s**********o
发帖数: 14359
32
还有一个办法,找到ORDER>=5次的CUSTOMER_ID LIST
对于每一个order 超过5次的CUSTOMER的ORDER进行排序
最多ORDER多少次MAX
用CURSOR对每一个ORDER 超过5次的CUSTOMER_ID
从5 LOOP到MAX
如果 orderdate 5-1, 6-2,7-3,8-4,一直LOOP到MAX- (MAX-4) 如果有<10的
跳出LOOP ADD CUSTOMER_ID to final list
NEXT CUSTOMER
ORDER_SEQ MAXORDER CUSTOMER_ID ORDERDATE
1 5 123 1/1/1900
2 5 123 1/2/1900
3 5 123 2/2/1900
4 5 123 3/2/1900
5 5 123 4/2/1900
1 7 234 1/1/1900
2 7 234 1/2/1900
3 7 234 2/2/1900
4 7 234 3/2/1900
5 7 234 4/2/1900
6 7 234 6/2/1900
7 7 234 9/2/1900
1 10 345 1/1/1900
2 10 345 1/2/1900
3 10 345 2/2/1900
4 10 345 3/2/1900
5 10 345 4/2/1900
6 10 345 6/2/1900
7 10 345 9/2/1900
8 10 345 10/2/1900
9 10 345 11/2/1900
10 10 345 12/2/1900
w*r
发帖数: 2421
33
CREATE TABLE CALENDAR (C_DATE DATE) ;
POPULATE CALENDAR WITH SEQUENCE OF DATES
SELECT
CUSTOMER,
SUM(O_CNT) OVER (PARTITION BY CUSTOMER ROWS BETWEEN 10 PRECEDING ROWS AND
CURRENT ROW)
AS ORDER_CNT_WITHIN_10_DAY
(
SELECT CDATE, CUSTOMER, COUNT(*) AS O_CNT
FROM CALENDAR C
LEFT OUTER JOIN
ORDER O
ON
C.C_DATE = O.O_DATE
GROUP BY CDATE, CUSTOMER
) A
QUALIFY ORDER_CNT_WITHIN_10_DAY >=10
c****s
发帖数: 10
34
求移动平均即可。
m******u
发帖数: 12400
35
That is an interesting idea. Please elaborate more. Thanks.
发信人: cognos (必得), 信区: Database
标 题: Re: 请教:找出10天内下了超过5次单的customers
发信站: BBS 未名空间站 (Fri Oct 9 23:16:56 2015, 美东)
求移动平均即可。
m****n
发帖数: 1066
36
这道题有最终答案吗?
不太好解。
w****w
发帖数: 521
37
select CustomerID
from (
select a.CustomerID,a.OrderDate,a.SalesOrderID,COUNT(b.OrderDate) Cnt
from [Sales].[SalesOrderHeader] a join [Sales].[SalesOrderHeader] b
on a.CustomerID=b.CustomerID
where DATEDIFF(day,a.OrderDate,b.OrderDate) between 0 and 10
group by a.CustomerID,a.OrderDate,a.SalesOrderID
) c
group by c.CustomerID
having MAX(Cnt)>=5;
The key is for each order, count the number of orders in next 10 days.
OrderID here is for order identification, otherwise orders with same date
will be merged during group by. Here is an example:
CustomerID OrderDate OrderID
11176 2007-08-13 00:00:00.000 52472
11176 2007-08-14 00:00:00.000 52535
11176 2007-08-14 00:00:00.000 52538
11176 2007-08-17 00:00:00.000 52708

【在 m****n 的大作中提到】
: 这道题有最终答案吗?
: 不太好解。

l**n
发帖数: 264
38
MySQL下有表格:
CustomerID OrderDate
101 2014-12-11
102 2014-12-13
101 2014-12-14
103 2014-12-15
... ...
如果想找出m天内下了超过k次单的顾客,能不能不用sub query实现?
w****n
发帖数: 266
39
select custid
from yourtable
where sysdate-orderdate》m
group by custid
having count(custid)》k
tested in oracle

【在 l**n 的大作中提到】
: MySQL下有表格:
: CustomerID OrderDate
: 101 2014-12-11
: 102 2014-12-13
: 101 2014-12-14
: 103 2014-12-15
: ... ...
: 如果想找出m天内下了超过k次单的顾客,能不能不用sub query实现?

s**********o
发帖数: 14359
40
对的,如果这个简单的问题都不会,SQL基本就不怎么懂
还可以用PARTITION BY进行RANK,由高到低

【在 w****n 的大作中提到】
: select custid
: from yourtable
: where sysdate-orderdate》m
: group by custid
: having count(custid)》k
: tested in oracle

相关主题
问一个 SQL combine records问题webbew SQL问题解法2 -- SQL 利器Recursive CTE
怎么在openquey里传变量.webbew SQL问题解法3 -- 还在远古时代总么办
来做sql题目。webbew SQL问题解法1 -- 90%以上的数据库版SQL问题可以用partition by解决
进入Database版参与讨论
l**n
发帖数: 264
41
不是最近10天,是任何10天内

【在 w****n 的大作中提到】
: select custid
: from yourtable
: where sysdate-orderdate》m
: group by custid
: having count(custid)》k
: tested in oracle

l**n
发帖数: 264
42
有可能我没说清楚,不是最近10天,而是任何10天内
如果是最近10天内,那么这个很简单

【在 s**********o 的大作中提到】
: 对的,如果这个简单的问题都不会,SQL基本就不怎么懂
: 还可以用PARTITION BY进行RANK,由高到低

m******u
发帖数: 12400
43
LZ是个女的。既然都更新了,何不更准确点:应该是任意连续的m天。不是最近10天,
也不是任意10天,而是任意连续的10天。
是不太好做。哪位大拿做出来,请贴上来。
发信人: lvin (snake~), 信区: Database
标 题: Re: 请教:找出10天内下了超过5次单的customers
发信站: BBS 未名空间站 (Tue Oct 6 15:39:33 2015, 美东)
有可能我没说清楚,不是最近10天,而是任何10天内
如果是最近10天内,那么这个很简单
m******u
发帖数: 12400
44
要用到循环或cursors么?
B*****g
发帖数: 34098
45
方法一 selfjoin, join 10天之内的,然后count >=5。
方法二 partition by (LAG),找前面第5个,看时间是不是差是不是小于10天
由于机器人的要求是mysql,所以方法二不能使用
c*****d
发帖数: 6045
46
beijing说:任何语句都可以用partition实现
coolbid说:任何subquery都可以用join实现

【在 m******u 的大作中提到】
: LZ是个女的。既然都更新了,何不更准确点:应该是任意连续的m天。不是最近10天,
: 也不是任意10天,而是任意连续的10天。
: 是不太好做。哪位大拿做出来,请贴上来。
: 发信人: lvin (snake~), 信区: Database
: 标 题: Re: 请教:找出10天内下了超过5次单的customers
: 发信站: BBS 未名空间站 (Tue Oct 6 15:39:33 2015, 美东)
: 有可能我没说清楚,不是最近10天,而是任何10天内
: 如果是最近10天内,那么这个很简单

B*****g
发帖数: 34098
47
ding
再加一句,在mysql上还玩复杂sql的都是耍流氓

【在 c*****d 的大作中提到】
: beijing说:任何语句都可以用partition实现
: coolbid说:任何subquery都可以用join实现

c*****d
发帖数: 6045
48
select o1.CustomerID , COUNT(*)
from orders o1 join orders o2
on o1.CustomerID = o2.CustomerID
where o1. OrderDate > o2. OrderDate
and o1. OrderDate < o2. OrderDate+ 10
group by o1.CustomerID
having COUNT(*) > 5;
m******u
发帖数: 12400
49
不是任意subquery都能用join实现的。
m******u
发帖数: 12400
50
是不是要distinct一下。不然会重复选出一些customerid吧。select list 中的count
(*)可以去掉。
发信人: coolbid (Dreams bring hopes), 信区: Database
标 题: Re: 请教:找出10天内下了超过5次单的customers
发信站: BBS 未名空间站 (Tue Oct 6 16:04:11 2015, 美东)
select o1.CustomerID , COUNT(*)
from orders o1 join orders o2
on o1.CustomerID = o2.CustomerID
where o1. OrderDate > o2. OrderDate
and o1. OrderDate < o2. OrderDate+ 10
group by o1.CustomerID
having COUNT(*) > 5;
相关主题
养老院人事 SQL难题解法综述 -- 申精面试问题,关于oracle 8i
求助一个MS SQL的问题。 关于SSRS的老印给我的一个Challenge
a complex sql query, high hand help!!!求教:数据操作
进入Database版参与讨论
c*****d
发帖数: 6045
51
你能给我举出个不能实现的例子吗

【在 m******u 的大作中提到】
: 不是任意subquery都能用join实现的。
c*****d
发帖数: 6045
52
如果只是要找到这样的ID,加上distinct去掉重复的

count

【在 m******u 的大作中提到】
: 是不是要distinct一下。不然会重复选出一些customerid吧。select list 中的count
: (*)可以去掉。
: 发信人: coolbid (Dreams bring hopes), 信区: Database
: 标 题: Re: 请教:找出10天内下了超过5次单的customers
: 发信站: BBS 未名空间站 (Tue Oct 6 16:04:11 2015, 美东)
: select o1.CustomerID , COUNT(*)
: from orders o1 join orders o2
: on o1.CustomerID = o2.CustomerID
: where o1. OrderDate > o2. OrderDate
: and o1. OrderDate < o2. OrderDate+ 10

m******u
发帖数: 12400
53
你这个query是错的。我在adventureworks上试过了。找出的数据是错的。不是任意连
续10。原因可能是没join上。这里贴上customerid是11330的所有order。11330是你
query找出来的最前面的一位customer,你看他的order没有连续10天超过5个的。
11330 2007-11-17 00:00:00.000 2007-11-12 00:00:00.000
11330 2007-11-25 00:00:00.000 2007-11-17 00:00:00.000
11330 2007-11-25 00:00:00.000 2007-11-17 00:00:00.000
11330 2007-12-07 00:00:00.000 2007-12-06 00:00:00.000
11330 2007-12-17 00:00:00.000 2007-12-07 00:00:00.000
11330 2007-12-19 00:00:00.000 2007-12-17 00:00:00.000
11330 2008-01-10 00:00:00.000 2008-01-06 00:00:00.000
11330 2008-03-07 00:00:00.000 2008-02-27 00:00:00.000
11330 2008-05-02 00:00:00.000 2008-04-24 00:00:00.000
11330 2008-06-01 00:00:00.000 2008-05-22 00:00:00.000
11330 2008-06-03 00:00:00.000 2008-06-01 00:00:00.000
11330 2008-06-13 00:00:00.000 2008-06-03 00:00:00.000
11330 2008-06-16 00:00:00.000 2008-06-13 00:00:00.000
m******u
发帖数: 12400
54
上贴贴上的例子,漏了header。分别是:customerid, o1.orderdate, o2.orderdate
。可以看出没有连续10天超出5个order。
B*****g
发帖数: 34098
55
苦逼的大师group by时丢了一个

orderdate

【在 m******u 的大作中提到】
: 上贴贴上的例子,漏了header。分别是:customerid, o1.orderdate, o2.orderdate
: 。可以看出没有连续10天超出5个order。

m******u
发帖数: 12400
56
请问丢掉的是哪一个啥?
发信人: Beijing (我是猪,听说猪是被祝福的), 信区: Database
标 题: Re: 请教:找出10天内下了超过5次单的customers
发信站: BBS 未名空间站 (Tue Oct 6 16:46:25 2015, 美东)
苦逼的大师group by时丢了一个
B*****g
发帖数: 34098
57
group by o1.CustomerID, o1.orderdate

【在 m******u 的大作中提到】
: 请问丢掉的是哪一个啥?
: 发信人: Beijing (我是猪,听说猪是被祝福的), 信区: Database
: 标 题: Re: 请教:找出10天内下了超过5次单的customers
: 发信站: BBS 未名空间站 (Tue Oct 6 16:46:25 2015, 美东)
: 苦逼的大师group by时丢了一个

m******u
发帖数: 12400
58
加上这个之后只有一位11300的customer了。(在adventureworks2008r2,Sales.
SalesOrderHeader测试)
m******u
发帖数: 12400
59
该11300同学在2008-2-8 到2008-2-18间超过5个order,且只有这一次。
z0
发帖数: 71
60
select a.CustomerID ,
a.OrderDate ,
a.OrderID
from your_table a
join your_table b
on a.CustomerID = b.CustomerID
and a.OrderDate between b.OrderDate - 10 and b.OrderDate
group by 1,2,3
having count(1) >= 10 ;
相关主题
question: copy first N rows from table B to table A (DB2)query: in sql server 2005
a simpler sQL question, high help please!!!!问一个数据处理的问题,该如何实现单列转多行?14楼有图更新 (转载)
Help on migrating oracle to db2, outerjoinquery analyzer VS. Stored procedure
进入Database版参与讨论
l*********s
发帖数: 5409
61
sort the table based on ordering time, then check very other five records if
the period is less than 10 days.
c*****d
发帖数: 6045
62
确实少写了orderdate, 另外最后having count(*)不是5,是 5-1 = 4
select distinct o2.Customer_ID
from orders o1, orders o2
where o1.Customer_ID = o2.Customer_ID
and o1.order_date > o2.order_date
and o1.order_date <= o2.order_date + 10
group by o2.Customer_ID, o2.order_date
having COUNT(*) >= 4

【在 B*****g 的大作中提到】
: 苦逼的大师group by时丢了一个
:
: orderdate

c*****d
发帖数: 6045
63
a.orderID肯定不能出现在group by里,如果orderID是不重复的

【在 z0 的大作中提到】
: select a.CustomerID ,
: a.OrderDate ,
: a.OrderID
: from your_table a
: join your_table b
: on a.CustomerID = b.CustomerID
: and a.OrderDate between b.OrderDate - 10 and b.OrderDate
: group by 1,2,3
: having count(1) >= 10 ;

c*****d
发帖数: 6045
64
order by orderID, orderDate可以用SQL做
后面check every five records if period is less than 10 days怎么用SQL做?如果
不用PL/SQL游标的话

if

【在 l*********s 的大作中提到】
: sort the table based on ordering time, then check very other five records if
: the period is less than 10 days.

z****z
发帖数: 2054
65
根据lz的时间格式, 这个query会漏掉在同一天下的不同单子。

【在 c*****d 的大作中提到】
: 确实少写了orderdate, 另外最后having count(*)不是5,是 5-1 = 4
: select distinct o2.Customer_ID
: from orders o1, orders o2
: where o1.Customer_ID = o2.Customer_ID
: and o1.order_date > o2.order_date
: and o1.order_date <= o2.order_date + 10
: group by o2.Customer_ID, o2.order_date
: having COUNT(*) >= 4

B*****g
发帖数: 34098
66
我贴的方法2呀

【在 c*****d 的大作中提到】
: order by orderID, orderDate可以用SQL做
: 后面check every five records if period is less than 10 days怎么用SQL做?如果
: 不用PL/SQL游标的话
:
: if

B*****g
发帖数: 34098
67
机器人帖子大家太认真,嘿嘿

【在 z****z 的大作中提到】
: 根据lz的时间格式, 这个query会漏掉在同一天下的不同单子。
s**********o
发帖数: 14359
68
你先做个10天的表吧,从哪天开始到哪天结束,
先找到最开始的ORDER,总不可能是从1900开始吧,然后到最后的2015年
CALL STORED PROCEDURE PASS IN STARTDATE ENDDATE BY CURSOR
SP里,INSERT INTO A TABLE DISTINCT CUSTOMER_ID
虽然笨了点
s**********o
发帖数: 14359
69
还有一个办法,找到ORDER>=5次的CUSTOMER_ID LIST
对于每一个order 超过5次的CUSTOMER的ORDER进行排序
最多ORDER多少次MAX
用CURSOR对每一个ORDER 超过5次的CUSTOMER_ID
从5 LOOP到MAX
如果 orderdate 5-1, 6-2,7-3,8-4,一直LOOP到MAX- (MAX-4) 如果有<10的
跳出LOOP ADD CUSTOMER_ID to final list
NEXT CUSTOMER
ORDER_SEQ MAXORDER CUSTOMER_ID ORDERDATE
1 5 123 1/1/1900
2 5 123 1/2/1900
3 5 123 2/2/1900
4 5 123 3/2/1900
5 5 123 4/2/1900
1 7 234 1/1/1900
2 7 234 1/2/1900
3 7 234 2/2/1900
4 7 234 3/2/1900
5 7 234 4/2/1900
6 7 234 6/2/1900
7 7 234 9/2/1900
1 10 345 1/1/1900
2 10 345 1/2/1900
3 10 345 2/2/1900
4 10 345 3/2/1900
5 10 345 4/2/1900
6 10 345 6/2/1900
7 10 345 9/2/1900
8 10 345 10/2/1900
9 10 345 11/2/1900
10 10 345 12/2/1900
w*r
发帖数: 2421
70
CREATE TABLE CALENDAR (C_DATE DATE) ;
POPULATE CALENDAR WITH SEQUENCE OF DATES
SELECT
CUSTOMER,
SUM(O_CNT) OVER (PARTITION BY CUSTOMER ROWS BETWEEN 10 PRECEDING ROWS AND
CURRENT ROW)
AS ORDER_CNT_WITHIN_10_DAY
(
SELECT CDATE, CUSTOMER, COUNT(*) AS O_CNT
FROM CALENDAR C
LEFT OUTER JOIN
ORDER O
ON
C.C_DATE = O.O_DATE
GROUP BY CDATE, CUSTOMER
) A
QUALIFY ORDER_CNT_WITHIN_10_DAY >=10
相关主题
query analyzer VS. Stored procedure怎么在openquey里传变量.
请教SQL server的一个programming的问题,谢谢来做sql题目。
问一个 SQL combine records问题webbew SQL问题解法2 -- SQL 利器Recursive CTE
进入Database版参与讨论
c****s
发帖数: 10
71
求移动平均即可。
m******u
发帖数: 12400
72
That is an interesting idea. Please elaborate more. Thanks.
发信人: cognos (必得), 信区: Database
标 题: Re: 请教:找出10天内下了超过5次单的customers
发信站: BBS 未名空间站 (Fri Oct 9 23:16:56 2015, 美东)
求移动平均即可。
m****n
发帖数: 1066
73
这道题有最终答案吗?
不太好解。
w****w
发帖数: 521
74
select CustomerID
from (
select a.CustomerID,a.OrderDate,a.SalesOrderID,COUNT(b.OrderDate) Cnt
from [Sales].[SalesOrderHeader] a join [Sales].[SalesOrderHeader] b
on a.CustomerID=b.CustomerID
where DATEDIFF(day,a.OrderDate,b.OrderDate) between 0 and 10
group by a.CustomerID,a.OrderDate,a.SalesOrderID
) c
group by c.CustomerID
having MAX(Cnt)>=5;
The key is for each order, count the number of orders in next 10 days.
OrderID here is for order identification, otherwise orders with same date
will be merged during group by. Here is an example:
CustomerID OrderDate OrderID
11176 2007-08-13 00:00:00.000 52472
11176 2007-08-14 00:00:00.000 52535
11176 2007-08-14 00:00:00.000 52538
11176 2007-08-17 00:00:00.000 52708

【在 m****n 的大作中提到】
: 这道题有最终答案吗?
: 不太好解。

A*******g
发帖数: 607
75
总结一下,在advanctureworks下验证过:
select distinct Customerid from
(
Select ss1.customerid, ss1.salesorderid,count(*) as CountNumber
from
sales.SalesOrderHeader as ss1
join
sales.SalesOrderHeader as ss2
on ss1.CustomerID = ss2.CustomerID
and ss1.OrderDate <= ss2.OrderDate
and ss1.OrderDate >= ss2.orderDate - 10
group by ss1.customerid, ss1.salesorderid
having count(*) > =5
order by 1
) as result
A*******g
发帖数: 607
76
去掉 order by

总结一下,在advanctureworks下验证过:select distinct Customerid from ( Select
ss1.customerid, ss1.s........

【在 A*******g 的大作中提到】
: 总结一下,在advanctureworks下验证过:
: select distinct Customerid from
: (
: Select ss1.customerid, ss1.salesorderid,count(*) as CountNumber
: from
: sales.SalesOrderHeader as ss1
: join
: sales.SalesOrderHeader as ss2
: on ss1.CustomerID = ss2.CustomerID
: and ss1.OrderDate <= ss2.OrderDate

1 (共1页)
进入Database版参与讨论
相关主题
question: copy first N rows from table B to table A (DB2)怎么在openquey里传变量.
a simpler sQL question, high help please!!!!来做sql题目。
Help on migrating oracle to db2, outerjoinwebbew SQL问题解法2 -- SQL 利器Recursive CTE
query: in sql server 2005webbew SQL问题解法3 -- 还在远古时代总么办
问一个数据处理的问题,该如何实现单列转多行?14楼有图更新 (转载)webbew SQL问题解法1 -- 90%以上的数据库版SQL问题可以用partition by解决
query analyzer VS. Stored procedure养老院人事 SQL难题解法综述 -- 申精
请教SQL server的一个programming的问题,谢谢求助一个MS SQL的问题。 关于SSRS的
问一个 SQL combine records问题a complex sql query, high hand help!!!
相关话题的讨论汇总
话题: 1900话题: 00话题: orderdate话题: 10话题: order