2013-03-07 47 views
1

第一次问这样我们去。 林使用Oracle SQL和有一个表中的列列出重复日期从一行中的第2行开始

RNUMBER如号,PID为数字,VIEWDATE日期,租用为char(1)

有具有重复RNUMBER的但不同VIEWDATE的多个行。我试图用一个查询来显示RNUMBER,PID,第一个VIEWDATE,最后一个VIEWDATE。它应该匹配RNUMBERS,最后一个VIEWDATE将有一个RENTED ='Y'。

这是我最接近的查询。

select a.* 
from LabDataS13.lookedat a 
inner join 
    (select RNumber 
    from LabDataS13.lookedat 
    where RENTED like 'N' 
    group by RNumber 
    having count(*) > 1) b 
on a.RNumber = b.RNumber 
where a.RENTED like 'Y' 
order by a.RNUMBER 

丢失的种类。任何帮助,将不胜感激。谢谢

回答

0

期待每个rnumber有viewdates的多个条目,最后viewdate每个rnumber才会有rente d ='Y',其他人不会'Y'

select a.rnumber,a.pid,first_viewdate,last_viewdate from 
(select rnumber,pid,viewdate as last_viewdate from table where rented='Y') a, 
(select rnumber,pid,viewdate as first_viewdate from table where rowid in 
(select min(rowid) from table group by rnumber) and rented !='Y') b 
where a.rnumber=b.rnumber; 
+0

你真了不起!这完美的工作,我注意到我忘了添加表名。非常感谢你:) – issaaccbb 2013-03-07 10:07:04

+0

这只有当rowid的顺序与OP所需的顺序相匹配时才有效。我敢肯定,在这种情况下,oracle会改变索引组织表或分区表的rowid。如果viewdate发生了变化,它也会破坏这个。所以作为一个通用的解决方案,有更好的方法 – 2013-03-07 15:57:51

+0

是真的。但这张桌子上没有任何索引,它不会很快发生变化,因为这对于课堂来说是个实践问题。顺便说一句,有人可以解释这是如何工作的?我一直在反复看。我习惯编程,所以DB不是我的特长。如果需要,PM可以很好。主要想知道第3-4行 – issaaccbb 2013-03-07 17:23:05

0

既然你已经定义了最后的'Y',所有你需要的是第一个记录。为了获得第一个,你可以使用Row_number。

WITH first 
    AS (SELECT Row_number() 
        over ( 
        PARTITION BY rnumber 
        ORDER BY viewdate) rn, 
       rnumber, 
       pid, 
       viewdate, 
       rented 
     FROM labdatas13.lookedat) 
SELECT * 
FROM labdatas13.lookedat last 
     inner join first 
       ON first.rnumber= last.rnumber 
WHERE last.rented = 'Y' 
     AND first.rn = 1 

DEMO

如果由于某种原因,你不能依靠“Y”在租来的,那么你会只需添加一个第二ROW_NUMBER订购的其他方式,只是使用的数据来自WITH子句

WITH data 
    AS (SELECT Row_number() 
        over ( 
        PARTITION BY rnumber 
        ORDER BY viewdate) rn_first, 
       Row_number() 
        over (
        PARTITION BY rnumber 
        ORDER BY viewdate desc) rn_last, 
       rnumber, 
       pid, 
       viewdate, 
       rented 
     FROM labdatas13.lookedat) 
SELECT * 
FROM data first 
     inner join data lastg 
       ON first.rnumber= last.rnumber 
WHERE 
    first.rn_first = 1 
    AND last.rn_last= 1 

DEMO

相关问题