繁体   English   中英

选择最近的条目

[英]select the most recent entry

我有下表:

LOCATION_ID, PERSON_ID, DATE
3, 65, 2016-06-03
7, 23, 2016-10-28
3, 23, 2016-08-05
5, 65, 2016-07-14

我想在PL / SQL中建立一个选择查询,以选择每个person_id具有最新 location_id的记录。 对于以上示例,所需结果应为:

LOCATION_ID, PERSON_ID, DATE
5, 65, 2016-07-14
7, 23, 2016-10-28

(日期表示为“ YYYY-MM-DD”)

谢谢!

其他建议是正确的,但是当您使用FIRST_VALUE和LAST_VALUE分析函数时,最可能是最紧凑,最快的解决方案

SELECT DISTINCT
   FIRST_VALUE(LOCATION_ID) OVER (PARTITION BY PERSON_ID ORDER BY THE_DATE 
             ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS LOCATION_ID, 
   PERSON_ID, 
   MAX(THE_DATE) OVER (PARTITION BY PERSON_ID) AS LAST_DATE
FROM YOUR_TABLE;

其他人更喜欢

SELECT 
   MAX(LOCATION_ID) KEEP (DENSE_RANK FIRST ORDER BY DATE) as LOCATION, 
   PERSON_ID, 
   MAX(DATE) as LAST_DATE
FROM YOUR_TABLE
GROUP BY PERSON_ID;

这样做是一样的,但是我对这个条款不太熟悉。 参见aggregate_function KEEP

您可以通过将结果按PERSON_ID分组并选择MAX(DATE)来首先提取每个人的最新事件。

然后将表本身与这两列相连,以获取LOCATION_ID

SELECT
  YOUR_TABLE.LOCATION_ID,
  YOUR_TABLE.PERSON_ID,
  YOUR_TABLE.DATE
FROM
  (SELECT
    PERSON_ID, MAX(DATE) AS max_date
  FROM
    YOUR_TABLE
  GROUP BY
    PERSON_ID
  ) AS t1
LEFT JOIN
  YOUR_TABLE
ON
  YOUR_TABLE.PERSON_ID = t1.PERSON_ID
  AND
  YOUR_TABLE.DATE = t1.max_date

顺便说一句,您不应对列名使用DATE类的保留字。

这是用来显示其工作情况的小提琴: http : //sqlfiddle.com/#!9/efdcb/2

@quasoft是正确的。 解决这类GROUP BY问题的另一种方法(当您要返回的列多于要分组的列时。在这种情况下,您需要返回location_id,person_id。但是只需要按person_id分组)。使用分析函数

--schema:
CREATE TABLE my_table 
  ( 
     location_id NUMBER, 
     person_id   NUMBER, 
     date_       DATE 
  ); 

INSERT ALL 
INTO my_table 
VALUES (3, 65, To_date('2016-06-03', 'YYYY-MM-DD')) 
INTO my_table 
VALUES (7, 23, To_date('2016-10-28', 'YYYY-MM-DD')) 
INTO my_table 
VALUES (3, 23, To_date('2016-08-05', 'YYYY-MM-DD')) 
INTO my_table 
VALUES (5, 65, To_date('2016-07-14', 'YYYY-MM-DD')) 
SELECT * 
FROM   dual; 

--query:
WITH ordered 
     AS (SELECT location_id, 
                person_id, 
                date_, 
                Row_number() 
                  over ( 
                    PARTITION BY person_id 
                    ORDER BY date_ DESC) RN 
         FROM   my_table) 
SELECT location_id, 
       person_id, 
       date_ 
FROM   ordered 
WHERE  rn = 1; 

查询ordered排序你行对各组按日期。 主查询在排序后返回每个组的前1个。 因此,在这种情况下,它将返回最后一个(我们由date_desc排序)。

这可能有效!

SELECT * FROM Your_Table A
JOIN (SELECT PERSON_ID,MAX(DATE) as MaxDate FROM Your_Table 
GROUP BY PERSON_ID) B
ON A.PERSON_ID = B.PERSON_ID AND A.DATE = B.MaxDate

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM