purchase_del表记录销户数据
包括字段username ,date,purchase_name
关键子是username+date
每个用户有多个销户记录,
现在要删除其中每个用户最新的两条记录(即date离现在最近的两条记录),
怎么写sql

解决方案 »

  1.   


    delete purchase_del tb0 where exists
    (
       select 1   (
         select rownum as sn,tb2.username,tb2.date from purchase_del tb2 where 
         tb2.username = tb2.username order by date  desc
       )  tb1 
       where tb1.username = tb0.username 
             and tb1.date = tb0.date 
             and tb1.sn < 3
    )
      

  2.   

    测试数据:
    SQL> select * from purchase;USERNAME                                                     TDATE       PURCHASE_NAME
    ------------------------------------------------------------ ----------- ------------a                                                            01/01/2007  a1
    a                                                            02/01/2007  a1
    a                                                            03/01/2007  a1
    b                                                            02/01/2007  b1
    b                                                            01/01/2007  b1
    b                                                            03/01/2007  b16 rows selected查询每个类别最新的前两条:
    SQL> select * from (
      2  select username,tdate,row_number()over(partition by username order by tdate desc) as idx from purchase
      3  ) a where a.idx<=2;USERNAME                                                     TDATE              IDX
    ------------------------------------------------------------ ----------- ----------
    a                                                            03/01/2007           1
    a                                                            02/01/2007           2
    b                                                            03/01/2007           1
    b                                                            02/01/2007           2
      

  3.   

    感谢两位的解答
    感觉阿代的sql不太对,tb2.username = tb2.username 是多余的,而且这样只会删掉两条记录,而不是每个用户的最新两条
    ”视爱情为奢侈品“是高手啊,sql经验证是正确的,这是查询每个类别最新的前两条,小弟还是不清楚删除的sql怎样写
    请赐教
      

  4.   

    select
    和delete的原理是一样的。lz你要理解,你的问题最核心的是rownum这个oracle的伪列
      

  5.   

    比如del TEST where number in
    (select number from(select date ,instance,status,number from Test as a
    where date<>
     (select max(date) from Test 
       where a.number=number))
    and rownum<=100
      

  6.   

    purchase_del 里面难道就没有一个Primary key的字段?
    如果有
    删除就容易多了
      

  7.   

    应该是tb2.username = tb0.username ,昨天敲错了,如果去掉该条件只能删除两条,加上该条件会删除每个用户的最近两条
    delete purchase_del tb0 where exists
    (
       select 1   (
         select rownum as sn,tb2.username,tb2.date from purchase_del tb2 where 
         tb2.username = tb0.username order by date  desc
       )  tb1 
       where tb1.username = tb0.username 
             and tb1.date = tb0.date 
             and tb1.sn < 3
    )
      

  8.   

    做了个测试,我的sql不行,多重嵌套有问题
      

  9.   

    我也试了不行,但是sql看起来没有错误
    到底错误出在哪里拉
      

  10.   

    select * from srq_mstr,
    (select  min( to_char(sysdate,'yyyymmdd')-to_char(srq_date,'yyyymmdd')) as distwo ,srq_cust as srq_custmintwo
        from SRQ_MSTR  where srq_id not in (select srq_id from srq_mstr,
    (select  min( to_char(sysdate,'yyyymmdd')-to_char(srq_date,'yyyymmdd')) as dis ,srq_cust as srq_custmin
        from SRQ_MSTR  group by srq_cust) where srq_cust=srq_custmin and to_char(sysdate,'yyyymmdd')-to_char(srq_date,'yyyymmdd')=dis) group by srq_cust)
        where srq_cust=srq_custmintwo and to_char(sysdate,'yyyymmdd')-to_char(srq_date,'yyyymmdd')=distwo
        union 
        select * from srq_mstr,
    (select  min( to_char(sysdate,'yyyymmdd')-to_char
    (srq_date,'yyyymmdd')) as dis ,srq_cust as srq_custmin
        from SRQ_MSTR  group by srq_cust) where srq_cust=srq_custmin 
    and to_char(sysdate,'yyyymmdd')-to_char(srq_date,'yyyymmdd')=dis笨办法  上面表结构:srq_mstr(srq_id,srq_cust,srq_date) srq_id 在表中唯一
      

  11.   

    忘了删除:delete from srq_mstr where srq_id in (select * from srq_mstr,
    (select  min( to_char(sysdate,'yyyymmdd')-to_char(srq_date,'yyyymmdd')) as distwo ,srq_cust as srq_custmintwo
        from SRQ_MSTR  where srq_id not in (select srq_id from srq_mstr,
    (select  min( to_char(sysdate,'yyyymmdd')-to_char(srq_date,'yyyymmdd')) as dis ,srq_cust as srq_custmin
        from SRQ_MSTR  group by srq_cust) where srq_cust=srq_custmin and to_char(sysdate,'yyyymmdd')-to_char(srq_date,'yyyymmdd')=dis) group by srq_cust)
        where srq_cust=srq_custmintwo and to_char(sysdate,'yyyymmdd')-to_char(srq_date,'yyyymmdd')=distwo
        union 
        select * from srq_mstr,
    (select  min( to_char(sysdate,'yyyymmdd')-to_char
    (srq_date,'yyyymmdd')) as dis ,srq_cust as srq_custmin
        from SRQ_MSTR  group by srq_cust) where srq_cust=srq_custmin 
    and to_char(sysdate,'yyyymmdd')-to_char(srq_date,'yyyymmdd')=dis)