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 | |
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实现
|
|
|
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时丢了一个
|
|
|
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会漏掉在同一天下的不同单子。
|
|
|
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 | |
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 | |
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
|
|
|
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 | |
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; |
|
|
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 ; |
|
|
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 |
|
|
c****s 发帖数: 10 | |
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 | |
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
|