PostgresQL로 지정된 행의 레코드를 얻고 싶습니다.
3145 단어 PostgreSQLSQL
다음과 같은 테이블을 준비하고 실행 결과와 함께 해설해 갑니다.
준비 ①테이블 작성
CREATE TABLE sample_tbl
(
objectid bigserial NOT NULL,
col1 character varying,
col2 bigint,
createdate timestamp without time zone,
CONSTRAINT sample_tbl_pkey PRIMARY KEY (objectid)
)
준비② 샘플 레코드 준비
【실현 방법 1】 ROW_NUMBER 함수 사용
행 번호를 붙인 다음에, 임의의 행 번호로 취득하고 싶은 레코드를 지정하는 방법입니다.
우선 다음과 같은 SQL로 행 번호를 취득할 수 있는 것을 확인할 수 있습니다.
※ROW_NUMBER에 대해
SELECT ROW_NUMBER() OVER() AS rownum , * FROM sample_tbl;
실행 결과
임의의 순서로 행 번호를 붙이는 경우
SELECT ROW_NUMBER() OVER(ORDER BY createdate DESC) AS rownum , * FROM sample_tbl;
실행 결과
이제 createdate 내림차순으로 두 번째 레코드를 얻으려고합니다.
SELECT ROW_NUMBER() OVER(ORDER BY createdate DESC) AS rownum , * FROM sample_tbl WHERE rownum = 2;
이것으로 얻을 수 있다고 생각했는데, 실은 다음과 같은 에러가 나옵니다.
따라서 하위 쿼리여야 합니다.
SELECT * FROM
(SELECT ROW_NUMBER() OVER(ORDER BY createdate DESC) AS rownum , * FROM sample_tbl) AS tbl
WHERE tbl.rownum = 2;
네, 제대로 얻을 수 있었습니다.
【실현 방법 그 2】OFFSET와 LIMIT를 사용
마찬가지로 createdate 내림차순으로 두 번째 레코드를 얻는다고 가정 해 봅시다.
다음과 같은 SQL로 얻을 수 있습니다.
SELECT * FROM sample_tbl ORDER BY createdate DESC OFFSET 1 LIMIT 1;
획득했는지 확인할 수 있습니다.
LIMIT는 취득하고 싶은 레코드의 건수이므로 특히 설명은 불필요하다고 생각합니다.
OFFSET은 시작하고 싶은 행이라는 의미는 아니고, 날리는 행수를 의미하고 있으므로, 주의해 주세요.
2건째 이후를 원할 경우는 1건만 날리므로 「OFFSET 1」이 됩니다.
자세한 설명은 여기
요약
심플한 요건에 대응한다면, OFFSET, LIMIT 쪽이 간단하다고 생각했습니다.
다만, ○건목~○건목까지라고 하는 범위 지정은 어느쪽이나 대응할 수 있습니다만,
○건목과 ○건목과 ○건목과 같은 복수의 임의행을 취득하는 경우는 OFFSET, LIMIT가 아니라, ROW_NUMBER를 사용하는 쪽이 유연하게 대응할 수 있다고 생각합니다.
Reference
이 문제에 관하여(PostgresQL로 지정된 행의 레코드를 얻고 싶습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/heytommy811/items/e1d1f67156999bd6d544
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
SELECT ROW_NUMBER() OVER() AS rownum , * FROM sample_tbl;
SELECT ROW_NUMBER() OVER(ORDER BY createdate DESC) AS rownum , * FROM sample_tbl;
SELECT ROW_NUMBER() OVER(ORDER BY createdate DESC) AS rownum , * FROM sample_tbl WHERE rownum = 2;
SELECT * FROM
(SELECT ROW_NUMBER() OVER(ORDER BY createdate DESC) AS rownum , * FROM sample_tbl) AS tbl
WHERE tbl.rownum = 2;
마찬가지로 createdate 내림차순으로 두 번째 레코드를 얻는다고 가정 해 봅시다.
다음과 같은 SQL로 얻을 수 있습니다.
SELECT * FROM sample_tbl ORDER BY createdate DESC OFFSET 1 LIMIT 1;
획득했는지 확인할 수 있습니다.
LIMIT는 취득하고 싶은 레코드의 건수이므로 특히 설명은 불필요하다고 생각합니다.
OFFSET은 시작하고 싶은 행이라는 의미는 아니고, 날리는 행수를 의미하고 있으므로, 주의해 주세요.
2건째 이후를 원할 경우는 1건만 날리므로 「OFFSET 1」이 됩니다.
자세한 설명은 여기
요약
심플한 요건에 대응한다면, OFFSET, LIMIT 쪽이 간단하다고 생각했습니다.
다만, ○건목~○건목까지라고 하는 범위 지정은 어느쪽이나 대응할 수 있습니다만,
○건목과 ○건목과 ○건목과 같은 복수의 임의행을 취득하는 경우는 OFFSET, LIMIT가 아니라, ROW_NUMBER를 사용하는 쪽이 유연하게 대응할 수 있다고 생각합니다.
Reference
이 문제에 관하여(PostgresQL로 지정된 행의 레코드를 얻고 싶습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/heytommy811/items/e1d1f67156999bd6d544
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(PostgresQL로 지정된 행의 레코드를 얻고 싶습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/heytommy811/items/e1d1f67156999bd6d544텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)