복붙노트

[SQL] 열에 대해 최대 값을 갖는 행을 페치

SQL

열에 대해 최대 값을 갖는 행을 페치

표:

UserId, Value, Date.

나는 각각의 사용자 아이디에 대한 최대 (일)에 대한 사용자 아이디, 값 싶어. 즉, 최신 날짜가 각 사용자 아이디에 대한 값입니다. 단순히 SQL이 할 수있는 방법이 있나요? (바람직하게는 오라클)

업데이트 : 어떤 모호함에 대한 사과 : 나는 모든 사용자를 얻을 필요가있다. 그러나 사용자가 최신 날짜가 어디에 각 사용자 ID에 대한 만 행 것이다.

해결법

  1. ==============================

    1.이것은 my_date 열 값 해당 아이디에 대한 my_date의 최대 값과 동일하게되는 모든 행을 검색한다. 이것은 최대 날짜가 여러 행에있는 사용자 ID에 대해 여러 행을 검색 할 수 있습니다.

    이것은 my_date 열 값 해당 아이디에 대한 my_date의 최대 값과 동일하게되는 모든 행을 검색한다. 이것은 최대 날짜가 여러 행에있는 사용자 ID에 대해 여러 행을 검색 할 수 있습니다.

    select userid,
           my_date,
           ...
    from
    (
    select userid,
           my_date,
           ...
           max(my_date) over (partition by userid) max_my_date
    from   users
    )
    where my_date = max_my_date
    

    "분석 기능 바위"

    편집 : 최초의 코멘트에 관해서 ...

    "분석 쿼리와 사용 패배를 분석 쿼리의 목적을 자기 조인"

    더 없다이 코드에서 자체 조인. 매우 다른 문제, 완전히 표준 관행 - 분석적 기능을 포함하는 인라인 뷰의 결과에 배치 술어 대신있다.

    "오라클의 기본 창은 파티션의 첫 번째 행에서 현재 하나입니다"

    윈도 절은 절에 의해 순서의 존재에만 적용됩니다. 절에 의해 어떤 순서로, 어떤 윈도 절을 기본적으로 적용되지 않으며 아무도 명시 적으로 지정 될 수 없다.

    코드는 작동합니다.

  2. ==============================

    2.나는 많은 사람들이 하위 쿼리 또는이 작업을 수행하는 다른 공급 업체 특정 기능을 사용하여 볼 수 있지만 나는 종종 다음과 같은 방법으로 서브 쿼리없이 쿼리 이런 종류의 작업을 수행. 이 RDBMS의 모든 브랜드에서 작동해야 있도록 일반, 표준 SQL을 사용합니다.

    나는 많은 사람들이 하위 쿼리 또는이 작업을 수행하는 다른 공급 업체 특정 기능을 사용하여 볼 수 있지만 나는 종종 다음과 같은 방법으로 서브 쿼리없이 쿼리 이런 종류의 작업을 수행. 이 RDBMS의 모든 브랜드에서 작동해야 있도록 일반, 표준 SQL을 사용합니다.

    SELECT t1.*
    FROM mytable t1
      LEFT OUTER JOIN mytable t2
        ON (t1.UserId = t2.UserId AND t1."Date" < t2."Date")
    WHERE t2.UserId IS NULL;
    

    즉 : 다른 행이 동일한 사용자 ID와 큰 날짜와 함께 존재하지 않는 경우 T1에서 행을 가져옵니다.

    (그것이 SQL 예약어이기 때문에 구분 기호의 식별자 "날짜"를 넣어.)

    경우 T1. "날짜"= T2. "날짜"배로 나타날 경우. 일반적으로 테이블 auto_inc (서열) 키, 예를 들면있다 신분증. 다음 사용할 수있는 두 배로 방지하려면 :

    SELECT t1.*
    FROM mytable t1
      LEFT OUTER JOIN mytable t2
        ON t1.UserId = t2.UserId AND ((t1."Date" < t2."Date") 
             OR (t1."Date" = t2."Date" AND t1.id < t2.id))
    WHERE t2.UserId IS NULL;
    

    @Farhan에서 의견을 다시 :

    여기에 대한 자세한 설명입니다 :

    외부는 T2와 T1 가입 시도를 가입 할 수 있습니다. 기본적으로 T1의 모든 결과가 반환되고, T2의 일치가있는 경우, 그것은 또한 반환됩니다. T1의 주어진 행에 대해 (T2)에 일치하는 경우, 다음 쿼리는 여전히 T1의 행을 반환하고, T2의 모든 열을위한 자리로 NULL을 사용합니다. 즉 일반적으로 작업을 조인 얼마나 외부입니다.

    이 쿼리의 트릭은이 T2는 동일한 사용자 ID와 큰 날짜와 일치해야 함을의 일치 조건은 가입 설계하는 것입니다. 행이 더 큰 일, 즉 사용자 ID에 대한 가장 큰 일이 될 수 없습니다 대조 비교있어 T1에 다음 행이 T2에 존재하는 경우 아이디어는 것. 그러나 일치가없는 경우 - 더 행 T1의 행보다 더 큰 날짜와 T2에 존재하지 않는 경우 즉, - 우리는 T1의 행이 주어진 사용자 ID에 대한 가장 큰 날짜 행 것을 알고있다.

    도에 지정된 열 조인 조건 - (일치가 없을 때) 이러한 경우, T2의 열은 NULL이됩니다. 그럼 왜 우리가 사용하는 WHERE t2.UserId IS NULL, 어떤 행이 주어진 사용자 ID에 대한 더 큰 날짜가 발견 된 경우에 우린 검색 때문이다.

  3. ==============================

    3.

    SELECT userid, MAX(value) KEEP (DENSE_RANK FIRST ORDER BY date DESC)
      FROM table
      GROUP BY userid
    
  4. ==============================

    4.나는 정확한 열 이름을 모르겠지만, 이런 식으로 뭔가 될 것이다 :

    나는 정확한 열 이름을 모르겠지만, 이런 식으로 뭔가 될 것이다 :

        select userid, value
          from users u1
         where date = (select max(date)
                         from users u2
                        where u1.userid = u2.userid)
    
  5. ==============================

    5.직장에서 존재하지, 내가 손에 오라클이없는,하지만 난 적어도 거의 좋은하지 않습니다 상관 하위 쿼리를 사용하는 옵션을 피해야한다 오라클은 여러 열이 IN 절에 일치 할 수 있는지 리콜에 보인다 생각.

    직장에서 존재하지, 내가 손에 오라클이없는,하지만 난 적어도 거의 좋은하지 않습니다 상관 하위 쿼리를 사용하는 옵션을 피해야한다 오라클은 여러 열이 IN 절에 일치 할 수 있는지 리콜에 보인다 생각.

    이런 식으로 뭔가가, 아마 (열 목록이 괄호에 여부를해야하는지 기억이 안나요) :

    SELECT * 
    FROM MyTable
    WHERE (User, Date) IN
      ( SELECT User, MAX(Date) FROM MyTable GROUP BY User)
    

    편집 : 그냥 진짜 그것을 시도 :

    SQL> create table MyTable (usr char(1), dt date);
    SQL> insert into mytable values ('A','01-JAN-2009');
    SQL> insert into mytable values ('B','01-JAN-2009');
    SQL> insert into mytable values ('A', '31-DEC-2008');
    SQL> insert into mytable values ('B', '31-DEC-2008');
    SQL> select usr, dt from mytable
      2  where (usr, dt) in 
      3  ( select usr, max(dt) from mytable group by usr)
      4  /
    
    U DT
    - ---------
    A 01-JAN-09
    B 01-JAN-09
    

    작동 그래서, 새로운-fangly 물건 중 일부는 다른 곳에서 언급 있지만 더 확대됨에 될 수있다.

  6. ==============================

    6.난 당신이 오라클을 요청 알고 있지만, SQL 2005 년에 우리는 지금 이것을 사용 :

    난 당신이 오라클을 요청 알고 있지만, SQL 2005 년에 우리는 지금 이것을 사용 :

    
    -- Single Value
    ;WITH ByDate
    AS (
    SELECT UserId, Value, ROW_NUMBER() OVER (PARTITION BY UserId ORDER BY Date DESC) RowNum
    FROM UserDates
    )
    SELECT UserId, Value
    FROM ByDate
    WHERE RowNum = 1
    
    -- Multiple values where dates match
    ;WITH ByDate
    AS (
    SELECT UserId, Value, RANK() OVER (PARTITION BY UserId ORDER BY Date DESC) Rnk
    FROM UserDates
    )
    SELECT UserId, Value
    FROM ByDate
    WHERE Rnk = 1
    
  7. ==============================

    7.나는 그것을 테스트하기 위해 오라클이 없지만 가장 효율적인 솔루션을 분석 쿼리를 사용하는 것입니다. 이 모양은 다음과 같습니다

    나는 그것을 테스트하기 위해 오라클이 없지만 가장 효율적인 솔루션을 분석 쿼리를 사용하는 것입니다. 이 모양은 다음과 같습니다

    SELECT DISTINCT
        UserId
      , MaxValue
    FROM (
        SELECT UserId
          , FIRST (Value) Over (
              PARTITION BY UserId
              ORDER BY Date DESC
            ) MaxValue
        FROM SomeTable
      )
    

    난 당신이 외부 쿼리 없애 및 내부에 뚜렷한 넣을 수 있습니다 의심,하지만 난 모르겠어요. 그 때까지 나는이 한 일을 알고있다.

    당신이 분석 쿼리에 대해 배우고 싶은 경우에, 나는 http://www.orafaq.com/node/55 및 http://www.akadia.com/services/ora_analytic_functions.html 읽는 게 좋을 것. 여기에 간단한 요약입니다.

    후드 분석 쿼리는 순차적으로이를 처리, 전체 데이터 집합을 정렬 할 수 있습니다. 당신이 그것을 처리로 일부 창에서 각 행의 외모에 대해 다음 특정 기준에 따라 데이터 집합을 분할하고, (현재 행에 파티션의 첫 번째 값 기본값을 - 그 기본은 가장 효율적인 또한)와를 사용하여 값을 계산할 수 있습니다 분석 함수 번호 (목록은 골재의 기능과 매우 유사하다).

    여기이 경우 내부 쿼리가하는 일입니다. 전체 데이터 세트는 사용자 아이디 다음 날짜 DESC로 정렬됩니다. 그런 다음 한 번에 처리합니다. 각 행에 대해 당신은 사용자 ID와 (최대 날짜의 날짜가 분류되어 있기 때문에 DESC)이 사용자 아이디에 대해 볼 수있는 첫 번째 날짜가 돌아갑니다. 이렇게하면 중복 행 답변을 제공합니다. 그런 다음 외부 DISTINCT 과즙을 복제합니다.

    이 분석 쿼리 특히 멋진 예가 아니다. 훨씬 더 큰 승리를 위해 금융 영수증 테이블을 복용 고려하고 각 사용자와 영수증, 그들이 무엇을 지불의 실행중인 총 계산. 분석 쿼리를 효율적으로 그것을 해결. 다른 솔루션은 덜 효율적이다. 어떤 사람들은 2003 년 SQL 표준의 일부 이유입니다. (불행하게도 포스트 그레스가 아직 없습니다. 유감스럽게도 ...)

  8. ==============================

    8.조항은 모두 간단하고 최선가 필요하지 않을까요?

    조항은 모두 간단하고 최선가 필요하지 않을까요?

    select userid, my_date, ...
    from users
    qualify rank() over (partition by userid order by my_date desc) = 1
    

    상황은 여기 테라 데이타이와 17S이 실행 괜찮은 크기의 테스트에서 '인라인 뷰'/ 드리지 솔루션 # 1 버전 및 23S의 자격.

  9. ==============================

    9.오라클 12C의 +, 당신은 서브 쿼리없이 매우 간결이를 달성하기 위해 분석 함수 순위와 함께 상위 N 쿼리를 사용할 수 있습니다 :

    오라클 12C의 +, 당신은 서브 쿼리없이 매우 간결이를 달성하기 위해 분석 함수 순위와 함께 상위 N 쿼리를 사용할 수 있습니다 :

    select *
    from your_table
    order by rank() over (partition by user_id order by my_date desc)
    fetch first 1 row with ties;
    

    사용자 당 최대 my_date와 위의 반환 모든 행.

    당신이 최대 날짜가 하나 개의 행을 원한다면, ROW_NUMBER와 순위를 대체 :

    select *
    from your_table
    order by row_number() over (partition by user_id order by my_date desc)
    fetch first 1 row with ties; 
    
  10. ==============================

    10.사용 ROW_NUMBER ()는 고유 한 사용자 아이디에 대한 각 각 사용자 아이디에 대한 첫 번째 행 후 필터 (즉, ROW_NUMBER = 1) 날짜 내림차순 순위에 할당한다.

    사용 ROW_NUMBER ()는 고유 한 사용자 아이디에 대한 각 각 사용자 아이디에 대한 첫 번째 행 후 필터 (즉, ROW_NUMBER = 1) 날짜 내림차순 순위에 할당한다.

    SELECT UserId, Value, Date
    FROM (SELECT UserId, Value, Date,
            ROW_NUMBER() OVER (PARTITION BY UserId ORDER BY Date DESC) rn
          FROM users) u
    WHERE rn = 1;
    
  11. ==============================

    11.PostgreSQL을 8.4으로 이상이 사용할 수 있습니다 :

    PostgreSQL을 8.4으로 이상이 사용할 수 있습니다 :

    select user_id, user_value_1, user_value_2
      from (select user_id, user_value_1, user_value_2, row_number()
              over (partition by user_id order by user_date desc) 
            from users) as r
      where r.row_number=1
    
  12. ==============================

    12.난 당신이 이전 쿼리에이 변형을해야한다고 생각 :

    난 당신이 이전 쿼리에이 변형을해야한다고 생각 :

    SELECT UserId, Value FROM Users U1 WHERE 
    Date = ( SELECT MAX(Date)    FROM Users where UserId = U1.UserId)
    
  13. ==============================

    13.

    Select  
       UserID,  
       Value,  
       Date  
    From  
       Table,  
       (  
          Select  
              UserID,  
              Max(Date) as MDate  
          From  
              Table  
          Group by  
              UserID  
        ) as subQuery  
    Where  
       Table.UserID = subQuery.UserID and  
       Table.Date = subQuery.mDate  
    
  14. ==============================

    14.그냥 직장에서 "라이브"예를 써야했다 :)

    그냥 직장에서 "라이브"예를 써야했다 :)

    이 사람은 같은 날짜에 사용자 아이디에 대한 여러 값을 지원합니다.

    열 : 사용자 아이디, 값, 날짜

    SELECT
       DISTINCT UserId,
       MAX(Date) OVER (PARTITION BY UserId ORDER BY Date DESC),
       MAX(Values) OVER (PARTITION BY UserId ORDER BY Date DESC)
    FROM
    (
       SELECT UserId, Date, SUM(Value) As Values
       FROM <<table_name>>
       GROUP BY UserId, Date
    )
    

    당신은 FIRST_VALUE 대신 MAX를 사용하여 설명 할 계획을 찾아 볼 수 있습니다. 나는 그것을 함께 플레이하는 시간이 없었다.

    큰 테이블을 통해 검색하는 경우 쿼리에 FULL 힌트를 사용하는 경우 물론, 더 나은 아마.

  15. ==============================

    15.

    select VALUE from TABLE1 where TIME = 
       (select max(TIME) from TABLE1 where DATE= 
       (select max(DATE) from TABLE1 where CRITERIA=CRITERIA))
    
  16. ==============================

    16.나는 이런 식으로 뭔가를 생각합니다. (구문의 실수에 대한 용서, 나는이 시점에서 HQL을 사용하는 데 사용 해요!)

    나는 이런 식으로 뭔가를 생각합니다. (구문의 실수에 대한 용서, 나는이 시점에서 HQL을 사용하는 데 사용 해요!)

    편집 : 또한 질문을 오해! 쿼리를 수정 ...

    SELECT UserId, Value
    FROM Users AS user
    WHERE Date = (
        SELECT MAX(Date)
        FROM Users AS maxtest
        WHERE maxtest.UserId = user.UserId
    )
    
  17. ==============================

    17.(T-SQL) 첫 번째는 사용자와 사용자의 maxdate 모두를 얻을. maxdates에 연결된 사용자를 위해 해당 값을 찾기 위해 테이블에 가입하세요.

    (T-SQL) 첫 번째는 사용자와 사용자의 maxdate 모두를 얻을. maxdates에 연결된 사용자를 위해 해당 값을 찾기 위해 테이블에 가입하세요.

    create table users (userid int , value int , date datetime)
    insert into users values (1, 1, '20010101')
    insert into users values (1, 2, '20020101')
    insert into users values (2, 1, '20010101')
    insert into users values (2, 3, '20030101')
    
    select T1.userid, T1.value, T1.date 
        from users T1,
        (select max(date) as maxdate, userid from users group by userid) T2    
        where T1.userid= T2.userid and T1.date = T2.maxdate
    

    결과 :

    userid      value       date                                    
    ----------- ----------- -------------------------- 
    2           3           2003-01-01 00:00:00.000
    1           2           2002-01-01 00:00:00.000
    
  18. ==============================

    18.여기에 대한 대답은 오라클이다. 여기에 모든 SQL에서 좀 더 정교한 대답입니다 :

    여기에 대한 대답은 오라클이다. 여기에 모든 SQL에서 좀 더 정교한 대답입니다 :

    누가 최고의 전반적인 숙제 결과 (숙제 포인트의 최대 합계)가?

    SELECT FIRST, LAST, SUM(POINTS) AS TOTAL
    FROM STUDENTS S, RESULTS R
    WHERE S.SID = R.SID AND R.CAT = 'H'
    GROUP BY S.SID, FIRST, LAST
    HAVING SUM(POINTS) >= ALL (SELECT SUM (POINTS)
    FROM RESULTS
    WHERE CAT = 'H'
    GROUP BY SID)
    

    그리고 시간 기압 갖고 있지 않은 약간의 설명이 필요 더 어려운 예 :

    2008 년에 가장 많이 빌려 2008 년 가장 인기있는 책 (ISBN 및 제목), 즉를 제공합니다.

    SELECT X.ISBN, X.title, X.loans
    FROM (SELECT Book.ISBN, Book.title, count(Loan.dateTimeOut) AS loans
    FROM CatalogEntry Book
    LEFT JOIN BookOnShelf Copy
    ON Book.bookId = Copy.bookId
    LEFT JOIN (SELECT * FROM Loan WHERE YEAR(Loan.dateTimeOut) = 2008) Loan 
    ON Copy.copyId = Loan.copyId
    GROUP BY Book.title) X
    HAVING loans >= ALL (SELECT count(Loan.dateTimeOut) AS loans
    FROM CatalogEntry Book
    LEFT JOIN BookOnShelf Copy
    ON Book.bookId = Copy.bookId
    LEFT JOIN (SELECT * FROM Loan WHERE YEAR(Loan.dateTimeOut) = 2008) Loan 
    ON Copy.copyId = Loan.copyId
    GROUP BY Book.title);
    

    희망이 (사람을)하는 데 도움이 .. :)

    문안 인사, 거스

  19. ==============================

    19.날짜를 가정하면 지정된 사용자 ID에 대해 고유합니다, 여기에 몇 가지 TSQL입니다 :

    날짜를 가정하면 지정된 사용자 ID에 대해 고유합니다, 여기에 몇 가지 TSQL입니다 :

    SELECT 
        UserTest.UserID, UserTest.Value
    FROM UserTest
    INNER JOIN
    (
        SELECT UserID, MAX(Date) MaxDate
        FROM UserTest
        GROUP BY UserID
    ) Dates
    ON UserTest.UserID = Dates.UserID
    AND UserTest.Date = Dates.MaxDate 
    
  20. ==============================

    20.나는 아주 늦게 파티에있어하지만 다음과 같은 해킹 상관 하위 쿼리 및 분석 모두 기능을 능가하지만, 하나 개의 제한이됩니다 값을 문자열로 변환해야합니다. 그래서 날짜, 숫자 등의 문자열을 사용할 수 있습니다. 코드는 잘 보이지 않지만 실행 프로파일은 중대하다.

    나는 아주 늦게 파티에있어하지만 다음과 같은 해킹 상관 하위 쿼리 및 분석 모두 기능을 능가하지만, 하나 개의 제한이됩니다 값을 문자열로 변환해야합니다. 그래서 날짜, 숫자 등의 문자열을 사용할 수 있습니다. 코드는 잘 보이지 않지만 실행 프로파일은 중대하다.

    select
        userid,
        to_number(substr(max(to_char(date,'yyyymmdd') || to_char(value)), 9)) as value,
        max(date) as date
    from 
        users
    group by
        userid
    

    이 코드는 잘 작동하는 이유는 한 번만 테이블을 스캔 할 필요가 있다는 것입니다. 그것은 어떤 인덱스를 필요로하지 않으며 가장 중요한 것은 대부분의 분석 기능을 수행 테이블을 정렬 할 필요가 없습니다. 인덱스는 단일 사용자 ID에 대한 결과를 필터링해야하는 경우 비록 도움이 될 것입니다.

  21. ==============================

    21.

    select userid, value, date
      from thetable t1 ,
           ( select t2.userid, max(t2.date) date2 
               from thetable t2 
              group by t2.userid ) t3
     where t3.userid t1.userid and
           t3.date2 = t1.date
    

    이럴이 작동합니다. HTH

  22. ==============================

    22.나는이 일을해야한다고 생각?

    나는이 일을해야한다고 생각?

    Select
    T1.UserId,
    (Select Top 1 T2.Value From Table T2 Where T2.UserId = T1.UserId Order By Date Desc) As 'Value'
    From
    Table T1
    Group By
    T1.UserId
    Order By
    T1.UserId
    
  23. ==============================

    23.우선 상단의 대답은 다음과 같은 질문을 오해 시도, 여기에 올바른 결과와 완벽한 예입니다 :

    우선 상단의 대답은 다음과 같은 질문을 오해 시도, 여기에 올바른 결과와 완벽한 예입니다 :

    CREATE TABLE table_name (id int, the_value varchar(2), the_date datetime);
    
    INSERT INTO table_name (id,the_value,the_date) VALUES(1 ,'a','1/1/2000');
    INSERT INTO table_name (id,the_value,the_date) VALUES(1 ,'b','2/2/2002');
    INSERT INTO table_name (id,the_value,the_date) VALUES(2 ,'c','1/1/2000');
    INSERT INTO table_name (id,the_value,the_date) VALUES(2 ,'d','3/3/2003');
    INSERT INTO table_name (id,the_value,the_date) VALUES(2 ,'e','3/3/2003');
    

    --

      select id, the_value
          from table_name u1
          where the_date = (select max(the_date)
                         from table_name u2
                         where u1.id = u2.id)
    

    --

    id          the_value
    ----------- ---------
    2           d
    2           e
    1           b
    
    (3 row(s) affected)
    
  24. ==============================

    24.이것은 또한 중복 (각 USER_ID에 대해 하나 개의 행을 리턴)의 처리됩니다 :

    이것은 또한 중복 (각 USER_ID에 대해 하나 개의 행을 리턴)의 처리됩니다 :

    SELECT *
    FROM (
      SELECT u.*, FIRST_VALUE(u.rowid) OVER(PARTITION BY u.user_id ORDER BY u.date DESC) AS last_rowid
      FROM users u
    ) u2
    WHERE u2.rowid = u2.last_rowid
    
  25. ==============================

    25.그냥이 테스트는 로깅 테이블에 작동하는 것 같다

    그냥이 테스트는 로깅 테이블에 작동하는 것 같다

    select ColumnNames, max(DateColumn) from log  group by ColumnNames order by 1 desc
    
  26. ==============================

    26.이것은 단순하게해야한다 :

    이것은 단순하게해야한다 :

    SELECT UserId, Value
    FROM Users u
    WHERE Date = (SELECT MAX(Date) FROM Users WHERE UserID = u.UserID)
    
  27. ==============================

    27.파티션 KEEP, DENSE_RANK의 개념이없는 MySQL을위한 솔루션.

    파티션 KEEP, DENSE_RANK의 개념이없는 MySQL을위한 솔루션.

    select userid,
           my_date,
           ...
    from
    (
    select @sno:= case when @pid<>userid then 0
                        else @sno+1
        end as serialnumber, 
        @pid:=userid,
           my_Date,
           ...
    from   users order by userid, my_date
    ) a
    where a.serialnumber=0
    

    참조 : http://benincampus.blogspot.com/2013/08/select-rows-which-have-maxmin-value-in.html

  28. ==============================

    28.당신이 포스트 그레스를 사용하는 경우처럼 array_agg 사용할 수 있습니다

    당신이 포스트 그레스를 사용하는 경우처럼 array_agg 사용할 수 있습니다

    SELECT userid,MAX(adate),(array_agg(value ORDER BY adate DESC))[1] as value
    FROM YOURTABLE
    GROUP BY userid
    

    나는 오라클에 익숙하지 않다. 이것은 내가 생각 해낸 것입니다

    SELECT 
      userid,
      MAX(adate),
      SUBSTR(
        (LISTAGG(value, ',') WITHIN GROUP (ORDER BY adate DESC)),
        0,
        INSTR((LISTAGG(value, ',') WITHIN GROUP (ORDER BY adate DESC)), ',')-1
      ) as value 
    FROM YOURTABLE
    GROUP BY userid 
    

    두 쿼리는 허용 답변으로 동일한 결과를 반환합니다. SQLFiddles를 참조하십시오 :

  29. ==============================

    29.(사용자 ID, 날짜) 고유 경우, 즉 어떤 날짜는 동일한 사용자에 대해 두 번 나타납니다 :

    (사용자 ID, 날짜) 고유 경우, 즉 어떤 날짜는 동일한 사용자에 대해 두 번 나타납니다 :

    select TheTable.UserID, TheTable.Value
    from TheTable inner join (select UserID, max([Date]) MaxDate
                              from TheTable
                              group by UserID) UserMaxDate
         on TheTable.UserID = UserMaxDate.UserID
            TheTable.[Date] = UserMaxDate.MaxDate;
    
  30. ==============================

    30.

    select   UserId,max(Date) over (partition by UserId) value from users;
    
  31. from https://stackoverflow.com/questions/121387/fetch-the-row-which-has-the-max-value-for-a-column by cc-by-sa and MIT license