복붙노트

[SQL] SQL 쿼리는 지정된 키의 각 인스턴스에 대해 가장 최근의 행을 얻을 수 있습니다

SQL

SQL 쿼리는 지정된 키의 각 인스턴스에 대해 가장 최근의 행을 얻을 수 있습니다

나는 IP, 사용자를 얻으려고 노력하고, 사용자와 하나 이상의 이전 IPS에 대한 현재의 IP를 모두 포함 할 수있는 테이블에서 가장 최근의 타임 스탬프하고 있습니다. 나는 가장 최근의 IP 및 관련 타임 스탬프를 포함하는 각 사용자에 대해 하나 개의 행을하고 싶습니다. 그래서 테이블은 다음과 같다 경우 :

username      |  ip      |  time_stamp  
--------------|----------|--------------  
ted           | 1.2.3.4  | 10  
jerry         | 5.6.6.7  | 12  
ted           | 8.8.8.8  | 30  

나는 쿼리의 출력이 될 기대 :

jerry    |  5.6.6.7   |  12
ted      |  8.8.8.8   |  30  

나는 하나의 SQL 쿼리에서이 작업을 수행 할 수 있습니까? 이 중요한 경우, DBMS는 PostgreSQL을합니다.

해결법

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

    1.이 시도:

    이 시도:

    Select u.[username]
          ,u.[ip]
          ,q.[time_stamp]
    From [users] As u
    Inner Join (
        Select [username]
              ,max(time_stamp) as [time_stamp]
        From [users]
        Group By [username]) As [q]
    On u.username = q.username
    And u.time_stamp = q.time_stamp
    
  2. ==============================

    2.(PostgreSQL을 지원 - SQL 바이올린의 참조) ROW_NUMBER 창 기능을 가진 멋진 우아한 해결책 :

    (PostgreSQL을 지원 - SQL 바이올린의 참조) ROW_NUMBER 창 기능을 가진 멋진 우아한 해결책 :

    SELECT username, ip, time_stamp FROM (
     SELECT username, ip, time_stamp, 
      ROW_NUMBER() OVER (PARTITION BY username ORDER BY time_stamp DESC) rn
     FROM Users
    ) tmp WHERE rn = 1;
    
  3. ==============================

    3.이 같은:

    이 같은:

    select * 
    from User U1
    where time_stamp = (
      select max(time_stamp) 
      from User 
      where username = U1.username)
    

    그것을해야한다.

  4. ==============================

    4.위의 답변은 모두 당신이 각 사용자와 TIME_STAMP에 대해 하나 개의 행이 있다고 가정합니다. 응용 프로그램과 TIME_STAMP의 세분화에 따라이 유효한 가정하지 않을 수 있습니다. 당신이 특정 사용자에 대한 TIME_STAMP의 관계를 처리해야하는 경우 위의 답변 중 하나를 확장 할 필요가 것입니다.

    위의 답변은 모두 당신이 각 사용자와 TIME_STAMP에 대해 하나 개의 행이 있다고 가정합니다. 응용 프로그램과 TIME_STAMP의 세분화에 따라이 유효한 가정하지 않을 수 있습니다. 당신이 특정 사용자에 대한 TIME_STAMP의 관계를 처리해야하는 경우 위의 답변 중 하나를 확장 할 필요가 것입니다.

    한 쿼리에서이를 작성하려면 또 다른 중첩 된 하위 쿼리를 필요로 - 일이 더 지저분 받기 시작하고 성능이 저하 될 수 있습니다.

    나는 주석으로이를 추가 한 것을 좋아했을 것이다 그러나 나는 아직 새 응답으로 게시물에 대한 유감 (50)의 명성이 없습니다!

  5. ==============================

    5.아직 의견을 게시하지만, @Cristi S의 대답은 나를 위해 치료를 작동 할 수 없습니다.

    아직 의견을 게시하지만, @Cristi S의 대답은 나를 위해 치료를 작동 할 수 없습니다.

    내 시나리오에서는, 나는 모든 product_ids에 대한 Lowest_Offers에서 가장 최근의 3 개 기록을 유지해야했습니다.

    이 확인 될 것이라고 생각을하지만, 구문이 잘못되었습니다 - 필요 삭제할 자신의 SQL을 재 작업합니다.

    DELETE from (
    SELECT product_id, id, date_checked,
      ROW_NUMBER() OVER (PARTITION BY product_id ORDER BY date_checked DESC) rn
    FROM lowest_offers
    ) tmp WHERE > 3;
    
  6. ==============================

    6.내가 다른 테이블에서 결과를 반환하고 있습니다 때문에 나는 이것을 사용하고있다. 내가 피하기 위해 노력하고 있지만이 / 한 적은 단계 승 도움이된다면 중첩 된 조인. 아 글쎄. 이 같은 일을 반환합니다.

    내가 다른 테이블에서 결과를 반환하고 있습니다 때문에 나는 이것을 사용하고있다. 내가 피하기 위해 노력하고 있지만이 / 한 적은 단계 승 도움이된다면 중첩 된 조인. 아 글쎄. 이 같은 일을 반환합니다.

    select
    users.userid
    , lastIP.IP
    , lastIP.maxdate
    
    from users
    
    inner join (
        select userid, IP, datetime
        from IPAddresses
        inner join (
            select userid, max(datetime) as maxdate
            from IPAddresses
            group by userid
            ) maxIP on IPAddresses.datetime = maxIP.maxdate and IPAddresses.userid = maxIP.userid
        ) as lastIP on users.userid = lastIP.userid
    
  7. from https://stackoverflow.com/questions/1140064/sql-query-to-get-most-recent-row-for-each-instance-of-a-given-key by cc-by-sa and MIT license