首页 > Oracle SQL > 查询那天的有效订单数最多

查询那天的有效订单数最多

2017年3月17日 发表评论 阅读评论

        有一天,测试的妹子问我,我想知道我们系统那天的有效交易最多,如果交易一直有效,当然是最后一天,把所有的交易累计就可以了,但是我们系统的交易是有有效期的,所以在累计交易时还要剔除掉过期的交易。例如下面的测试数据:

          

 订单号

交易日

到期日

B1

20170201

20170301

B7

20170201

20170311

B6

20170201

20170203

B2

20170202

20170302

B5

20170202

20170305

B3

20170203

20171010

B4

20170501

20170701

对于20170201这天有效交易当然是B1B7B6

20170202这天的有效交易是B1B7B6B2B5

20170203这天的有效交易就不能包含B6了,因为B6的到期日是20170203

20170501这天的有效交易就只有B3B4

明白了需求后,看看如何用SQL实现

1.我的思路首先是要表自关联,同时关联条件是非等值关联

因为只有交易日小于到期日的交易才是有效的。

SQL1:

SELECT t1.id, t1.trade_date,
t2.trade_date trade_date2,
t2.maturity_date m_date2 FROM ANGU_TEST1  t1,ANGU_TEST1 t2
WHERE t1.trade_date < t2.maturity_date
AND t1.trade_date >= t2.trade_date
  /

ID         TRADE_DATE TRADE_DATE M_DATE2
---------- ---------- ---------- ----------
B1         20170201   20170201   20170203
B1         20170201   20170201   20170301
B1         20170201   20170201   20170311
B7         20170201   20170201   20170203
B7         20170201   20170201   20170301
B7         20170201   20170201   20170311
B6         20170201   20170201   20170203
B6         20170201   20170201   20170301
B6         20170201   20170201   20170311
B2         20170202   20170201   20170203
B2         20170202   20170201   20170301
B2         20170202   20170202   20170302
B2         20170202   20170202   20170305
B2         20170202   20170201   20170311
B5         20170202   20170201   20170203
B5         20170202   20170201   20170301
B5         20170202   20170202   20170302
B5         20170202   20170202   20170305
B5         20170202   20170201   20170311
B3         20170203   20170201   20170301
B3         20170203   20170202   20170302
B3         20170203   20170202   20170305
B3         20170203   20170201   20170311
B3         20170203   20170203   20171010
B4         20170501   20170501   20170701
B4         20170501   20170203   20171010

结果集明显不对,原因是t1.trade_date
>= t2.trade_date
这个条件

当天的交易产生了笛卡尔积

SQL2:

SELECT t1.id, t1.trade_date,
 t2.trade_date trade_date2,
t2.maturity_date m_date2 FROM ANGU_TEST1  t1,ANGU_TEST1 t2
WHERE t1.trade_date < t2.maturity_date
AND t1.trade_date > t2.trade_date
/

ID         TRADE_DATE TRADE_DATE M_DATE2
---------- ---------- ---------- ----------
B2         20170202   20170201   20170203
B2         20170202   20170201   20170301
B2         20170202   20170201   20170311
B5         20170202   20170201   20170203
B5         20170202   20170201   20170301
B5         20170202   20170201   20170311
B3         20170203   20170201   20170301
B3         20170203   20170202   20170302
B3         20170203   20170202   20170305
B3         20170203   20170201   20170311
B4         20170501   20170203   20171010

还是有问题,累计时没有计算当天的交易,同时还是有计算重复的问题,所以我决定将其中一个表的交易日去重,这样比较的时候就没有重复的交易,同时补上当天的交易

SQL3:

WITH a AS (--构建一个没有重复交易日的表
SELECT DISTINCT trade_date trade_date FROM ANGU_TEST1
SELECT trade_date,SUM(a) FROM (
 SELECT trade_date,COUNT(*) a FROM (
SELECT  t1.trade_date,
t2.trade_date trade_date2,
t2.maturity_date m_date2 FROM a t1,ANGU_TEST1 t2
WHERE t1.trade_date < t2.maturity_date
 AND t1.trade_date > t2.trade_date)
GROUP BY trade_date
  UNION ALL--单独处理当天的交易
SELECT trade_date,COUNT(*) a FROM ANGU_TEST1 t
GROUP BY t.trade_date)
GROUP BY  trade_date;
TRADE_DATE     SUM(A)
---------- ----------
20170201            3
20170203            5
20170202            5
20170501            2

分类: Oracle SQL 标签:
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.