1

第一次问所以我们走了。我使用 Oracle SQL 并有一个包含列的表

RNUMBER 作为数字,PID 作为数字,VIEWDATE 作为日期,RENTED 作为 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

有点失落。任何帮助,将不胜感激。谢谢

4

2 回答 2

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”,那么您只需添加第二个 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 

演示

于 2013-03-07T03:27:36.680 回答
0

期望每个 rnumber 有多个 viewdates 条目,并且每个 rnumber 的最后一个 viewdate 将已租用='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 回答