[SQL] SQL 쿼리는 지정된 키의 각 인스턴스에 대해 가장 최근의 행을 얻을 수 있습니다
SQLSQL 쿼리는 지정된 키의 각 인스턴스에 대해 가장 최근의 행을 얻을 수 있습니다
나는 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.이 시도:
이 시도:
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.(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.이 같은:
이 같은:
select * from User U1 where time_stamp = ( select max(time_stamp) from User where username = U1.username)
그것을해야한다.
-
==============================
4.위의 답변은 모두 당신이 각 사용자와 TIME_STAMP에 대해 하나 개의 행이 있다고 가정합니다. 응용 프로그램과 TIME_STAMP의 세분화에 따라이 유효한 가정하지 않을 수 있습니다. 당신이 특정 사용자에 대한 TIME_STAMP의 관계를 처리해야하는 경우 위의 답변 중 하나를 확장 할 필요가 것입니다.
위의 답변은 모두 당신이 각 사용자와 TIME_STAMP에 대해 하나 개의 행이 있다고 가정합니다. 응용 프로그램과 TIME_STAMP의 세분화에 따라이 유효한 가정하지 않을 수 있습니다. 당신이 특정 사용자에 대한 TIME_STAMP의 관계를 처리해야하는 경우 위의 답변 중 하나를 확장 할 필요가 것입니다.
한 쿼리에서이를 작성하려면 또 다른 중첩 된 하위 쿼리를 필요로 - 일이 더 지저분 받기 시작하고 성능이 저하 될 수 있습니다.
나는 주석으로이를 추가 한 것을 좋아했을 것이다 그러나 나는 아직 새 응답으로 게시물에 대한 유감 (50)의 명성이 없습니다!
-
==============================
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.내가 다른 테이블에서 결과를 반환하고 있습니다 때문에 나는 이것을 사용하고있다. 내가 피하기 위해 노력하고 있지만이 / 한 적은 단계 승 도움이된다면 중첩 된 조인. 아 글쎄. 이 같은 일을 반환합니다.
내가 다른 테이블에서 결과를 반환하고 있습니다 때문에 나는 이것을 사용하고있다. 내가 피하기 위해 노력하고 있지만이 / 한 적은 단계 승 도움이된다면 중첩 된 조인. 아 글쎄. 이 같은 일을 반환합니다.
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
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
'SQL' 카테고리의 다른 글
[SQL] 싱글 부모 엔터티와 코어 데이터 성능 (0) | 2020.05.08 |
---|---|
[SQL] MySQL의에서 보관 IPv6 주소 (0) | 2020.05.08 |
[SQL] A는 포함하거나 테이블 또는 인덱싱 된 뷰에 FREETEXT 조건이 전체 텍스트하지 않기 때문에 사용할 수 없습니다 인덱스 (0) | 2020.05.08 |
[SQL] 무슨 오류를 일으키는 : 참조 된 테이블에 대한 키를 제공에는 고유 제한 조건의 일치가 없다? (0) | 2020.05.08 |
[SQL] 인덱스의 키 컬럼으로 사용하기 위해 유효하지 않은 유형이다 (0) | 2020.05.08 |