1

初めて質問するので、ここに行きます。Oracle SQLを使用していて、列を持つテーブルがあります

数値としての RNUMBER、数値としての PID、日付としての VIEWDATE、char(1) としての RENTED

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

一種の失われた。どんな助けでも大歓迎です。ありがとう

4

2 に答える 2

0

各rnumberにはviewdatesの複数のエントリがあり、各rnumberの最後のviewdateはrented ='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;
于 2013-03-07T09:28:12.743 に答える
0

last を '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 

デモ

何らかの理由で賃貸の「Y」に依存できない場合は、2 つ目の ROW_NUMBER Ordering を別の方法で追加し、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 

デモ

于 2013-03-07T03:27:36.680 に答える