免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3605 | 回复: 11

求一查询的sql [复制链接]

论坛徽章:
1
2017金鸡报晓
日期:2017-01-10 15:19:56
发表于 2008-09-18 08:19 |显示全部楼层
要求实现(分别用一个sql语句)
以收货人为依据查询
1.连续3日内重复出现20次的记录
2.一月内任一栏目总计出现30次的记录
3.连续3月内任一栏目总计出现50次的记录

表名:suborder
表结构
SUBORDER_ID           NUMBER(8)                       子订单标识                                         
PRODUCT               NUMBER(8)                       产品标识                                          
ORDERFORM_ID          NUMBER(8)                       主订单标识                                         
PRICE                 NUMBER(15,3)  Y                 订单价格                                          
SETTLE_PRICE          NUMBER(15,3)  Y                 商品VVGOO价                                       
TELPOINT              NUMBER(15)    Y                 补贴,积分额度                                      
VOUCHER               NUMBER(15)    Y                                                                    
FEE                   NUMBER(15,3)  Y                 运费价格                                          
FEE_NAME              VARCHAR2(100) Y                 运费名称                                          
COUNT                 NUMBER                 1        订单产品数量(目前默认1)                           
STATE                 VARCHAR2(20)                    订单流程状态                                       
CHANGE_REASON         VARCHAR2(60)  Y                 流程状态变更原因                                   
PAY_STATE             VARCHAR2(20)                    支付状态                                          
PAY_REASON            VARCHAR2(60)  Y                 支付状态变更原因                                   
PRODUCT_SERIAL        VARCHAR2(60)  Y                 商品编号,由商家回单填写                           
INVOICE               VARCHAR2(60)  Y                 发票号,由商家回单时候填写                          
ACCEPTER_DISTRIBUTE   VARCHAR2(50)  Y                 收货人地区                                         
ACCEPTER_ADDRESS      VARCHAR2(255) Y                 收货人地址                                         
ACCEPTER              VARCHAR2(255) Y                 收货人名称                                         
ACCEPTER_EMAIL        VARCHAR2(255) Y                 收货人邮件                                         
ACCEPTER_POST         VARCHAR2(20)  Y                 收货人邮编                                         
ACCEPTER_TELPHONE     VARCHAR2(20)  Y                 收货人固话                                         
ACCEPTER_MOBILE       VARCHAR2(20)  Y                 收货人手机                                         
ACCEPTER_ADDRESS_TYPE VARCHAR2(20)  Y                 收货人地址类型                                    
INVOINCR_HEADER       VARCHAR2(255) Y                 发票抬头                                          
INVOINCR_CONTENT      VARCHAR2(255) Y                 发票内容                                          
CREATE_DATE           DATE                   SYSDATE  创建日期                                          
SETTLE_STATE          VARCHAR2(20)  Y        'STS002' 结算状态                                          
SETTLE_DATE           DATE          Y                 商家汇钱给威威购的实际日期,可能与结算确认日期不同
SETTLE_AFFIRM_DATE    DATE          Y                 进行结算确认操作的当前日期                        
REFUND_DATE           DATE          Y                 退款日期                                          
MEMO                  VARCHAR2(255) Y                 备注                                               
AREA_ID               NUMBER(15)    Y                                                                    
SHOW_PRICE            NUMBER(15,3)  Y                 原始订单价格                                       
VOUCHER_TYPE          VARCHAR2(60)  Y                 注:1代表OnlineVoucher ,2代表Voucher               
SHOW_VOUCHER_NAME     VARCHAR2(60)  Y                 只供显示用,不记录到数据库   

论坛徽章:
0
发表于 2008-09-18 08:47 |显示全部楼层
select 收货人 from ...
where ...
group by 收货人
having count(*) >= 50

论坛徽章:
1
2017金鸡报晓
日期:2017-01-10 15:19:56
发表于 2008-09-18 09:32 |显示全部楼层
先谢谢回复,好像连续3日条件不好算

论坛徽章:
0
发表于 2008-09-18 10:00 |显示全部楼层
我以为你是要特定的时间段呢
要滚动的,不太好写

论坛徽章:
1
2017金鸡报晓
日期:2017-01-10 15:19:56
发表于 2008-09-18 10:01 |显示全部楼层
我摆渡了下,看了个算法觉得很复杂

论坛徽章:
0
发表于 2008-09-18 10:05 |显示全部楼层
建个calendar表,放连续日期
select a.day,收货人 from suborder a, calendar b
where a.create_date between b.day and b.day + 3
group by a.day,收货人
having count(*) >= 50
试一下这样

论坛徽章:
1
2017金鸡报晓
日期:2017-01-10 15:19:56
发表于 2008-09-18 10:08 |显示全部楼层
我试下,谢谢你了

论坛徽章:
1
2017金鸡报晓
日期:2017-01-10 15:19:56
发表于 2008-09-18 10:30 |显示全部楼层
好像不行因为suborder 表是不断更新的,如果新建calendar表要进行同步更新挺麻烦的!

论坛徽章:
1
2017金鸡报晓
日期:2017-01-10 15:19:56
发表于 2008-09-18 10:31 |显示全部楼层
摆渡的例子:
第一步:排序
SELECT * FROM WORK ORDER BY ID, DA
第二步:日期-ROWNUM如果相同的话认为他们是连续的,然后GORUP BY一下
SELECT A.*, TO_NUMBER (A.DA - ROWNUM) DAYS
FROM (SELECT * FROM WORK ORDER BY ID, DA) A
第三步:分别求出连续区间,让他们相减求出大于6的值
SELECT C.ID
(SELECT B.ID, (MAX (B.DA) - MIN (B.DA)) DAYS
FROM (SELECT A.*, TO_NUMBER (A.DA - ROWNUM) DAYS
FROM (SELECT * FROM WORK ORDER BY ID, DA) A) B
GROUP BY B.ID, B.DAYS) C
WHERE C.DAYS > 7

论坛徽章:
0
发表于 2008-09-18 22:17 |显示全部楼层
select
  a.收货人, min (b.rq), max (b.rq)
from
  your-tab a,
  your-tab b
where 1 = 1
and case when a.rq - b.rq >= 0 and a.rq - b.rq < 3
   then 1
   else 0
end = 1    -- 连续三天的日期检查
and a.收货人 = b.收货人
group by a.收货人
having count(*) >= 50
;

自链接的效率很低的。尤其是收货人可能不是索引的情况。你可以在上面建立索引。
其实最好的还是以收货人+日期进行排序,用3天这个时间窗口来滑动。效率会好很多。

刚才忘记了你是要找所有的记录。
这样就需要再用一个字查询。用 '收货人', rq in (最大,最小) 刚才的结果集。
就得到了所有的记录。

[ 本帖最后由 ivhb 于 2008-9-18 22:33 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP