2013-03-07 43 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

相關問題