[SQL] SQL 현재 행의 다음 또는 이전 행에 대해 행을 당겨
SQLSQL 현재 행의 다음 또는 이전 행에 대해 행을 당겨
id | photo title | created_date XEi43 | my family | 2009 08 04 dDls | friends group | 2009 08 05 32kJ | beautiful place | 2009 08 06 EOIk | working late | 2009 08 07
나는 ID 32kJ을 말해봐. 어떻게 다음 행 또는 이전을 얻을 것인가?
해결법
-
==============================
1.이것은 내가 이전 / 다음 기록을 찾는 데 사용하는 것입니다. 테이블의 모든 열은 정렬 열으로 사용하지 않고 조인 또는 더러운 해킹이 필요 할 수 있습니다 :
이것은 내가 이전 / 다음 기록을 찾는 데 사용하는 것입니다. 테이블의 모든 열은 정렬 열으로 사용하지 않고 조인 또는 더러운 해킹이 필요 할 수 있습니다 :
다음 레코드 (현재 레코드보다 날짜 이상) :
SELECT id, title, MIN(created) AS created_date FROM photo WHERE created > (SELECT created FROM photo WHERE id = '32kJ') GROUP BY created ORDER BY created ASC LIMIT 1;
이전 기록 (날짜 적은 전류를 기록 이상) :
SELECT id, title, MAX(created) AS created_date FROM photo WHERE created < (SELECT created FROM photo WHERE id = '32kJ') GROUP BY created ORDER BY created DESC LIMIT 1;
예:
CREATE TABLE `photo` ( `id` VARCHAR(5) NOT NULL, `title` VARCHAR(255) NOT NULL, `created` DATETIME NOT NULL, INDEX `created` (`created` ASC), PRIMARY KEY (`id`) ) ENGINE = InnoDB; INSERT INTO `photo` (`id`, `title`, `created`) VALUES ('XEi43', 'my family', '2009-08-04'); INSERT INTO `photo` (`id`, `title`, `created`) VALUES ('dDls', 'friends group', '2009-08-05'); INSERT INTO `photo` (`id`, `title`, `created`) VALUES ('32kJ', 'beautiful place', '2009-08-06'); INSERT INTO `photo` (`id`, `title`, `created`) VALUES ('EOIk', 'working late', '2009-08-07'); SELECT * FROM photo ORDER BY created; +-------+-----------------+---------------------+ | id | title | created | +-------+-----------------+---------------------+ | XEi43 | my family | 2009-08-04 00:00:00 | | dDls | friends group | 2009-08-05 00:00:00 | | 32kJ | beautiful place | 2009-08-06 00:00:00 | | EOIk | working late | 2009-08-07 00:00:00 | +-------+-----------------+---------------------+ SELECT id, title, MIN(created) AS next_date FROM photo WHERE created > (SELECT created FROM photo WHERE id = '32kJ') GROUP BY created ORDER BY created ASC LIMIT 1; +------+--------------+---------------------+ | id | title | next_date | +------+--------------+---------------------+ | EOIk | working late | 2009-08-07 00:00:00 | +------+--------------+---------------------+ SELECT id, title, MAX(created) AS prev_date FROM photo WHERE created < (SELECT created FROM photo WHERE id = '32kJ') GROUP BY created ORDER BY created DESC LIMIT 1; +------+---------------+---------------------+ | id | title | prev_date | +------+---------------+---------------------+ | dDls | friends group | 2009-08-05 00:00:00 | +------+---------------+---------------------+
-
==============================
2.난 당신이 MySQL을 사용하는 것을 깨닫게하지만 단지 참조를 위해, 여기에 납과 LAG 오라클의 분석 기능을 사용하여이 작업을 수행 할 방법은 다음과 같습니다
난 당신이 MySQL을 사용하는 것을 깨닫게하지만 단지 참조를 위해, 여기에 납과 LAG 오라클의 분석 기능을 사용하여이 작업을 수행 할 방법은 다음과 같습니다
select empno, ename, job, lag(ename, 1) over (order by ename) as the_guy_above_me, lead(ename, 2) over (order by ename) as the_guy_two_rows_below_me from emp order by ename
나는 오라클이 돈을 비용과 MySQL은 무료입니다 이유가있는 것 같아요 ... :-)
이 페이지 쇼를 어떻게 MySQL의에서 분석 기능을 에뮬레이션 할 수 있습니다.
-
==============================
3.당신은 날짜별로 이전 / 다음 행을 원하는 했습니까? 그렇다면, 당신이 할 수 있습니다 :
당신은 날짜별로 이전 / 다음 행을 원하는 했습니까? 그렇다면, 당신이 할 수 있습니다 :
select MyTable.* from MyTable join (select id from MyTable where created_date < (select created_date from MyTable where id = '32kJ') order by created_date desc, id desc limit 1 ) LimitedTable on LimitedTable.id = MyTable.fund_id;
-
==============================
4.마이크의 MAX / MIN 우리가 다음에 \ 이전 할 수 있습니다 트릭을 사용하면 모든 일에 대한 이동합니다. 이 MSACCESS의 예는 주식 시장 데이터 테이블의 모든 레코드에 대해 이전 가까이를 반환합니다. 참고 : '<='주말과 휴일입니다.
마이크의 MAX / MIN 우리가 다음에 \ 이전 할 수 있습니다 트릭을 사용하면 모든 일에 대한 이동합니다. 이 MSACCESS의 예는 주식 시장 데이터 테이블의 모든 레코드에 대해 이전 가까이를 반환합니다. 참고 : '<='주말과 휴일입니다.
SELECT tableName.Date, tableName.Close, (SELECT Close FROM tableName WHERE Date = (SELECT MAX(Date) FROM tableName WHERE Date <= iJoined.yesterday) ) AS previousClose FROM (SELECT Date, DateAdd("d",-1, Date) AS yesterday FROM tableName) AS iJoined INNER JOIN tableName ON tableName.Date=iJoined.Date;
... '어제'함수 (날짜-1) 점프를 사용하는 방법을 보여줍니다; 우리는 간단하게 사용할 수도 ...
(SELECT Date FROM tableName) AS iJoined /* previous record */ (SELECT MAX(Date) FROM tableName WHERE Date < iJoined.Date) /* next record */ (SELECT MIN(Date) FROM tableName WHERE Date > iJoined.Date)
트릭) (우리는 MAX \ MIN과 점프 기능 어떤 (들)의 이전 \ 다음 # 할 수있다
-
==============================
5.끔찍한 해킹 -이 있지만 힘의 일처럼하지 않습니다 ..
끔찍한 해킹 -이 있지만 힘의 일처럼하지 않습니다 ..
with yourresult as ( select id, photo_title, created_date, ROW_NUMBER() over(order by created_date) as 'RowNum' from your_table ) -- Previous select * from yourresult where RowNum = ((select RowNum from yourresult where id = '32kJ') -1) -- Next select * from yourresult where RowNum = ((select RowNum from yourresult where id = '32kJ') +1)
어떤 사용의?
-
==============================
6.나는 차 테이블의 키 (및 "행 번호"등)으로 ID를 고려하고, 이전 레코드와 각 레코드를 비교하는 데 사용했다. 다음 코드는 작동해야합니다.
나는 차 테이블의 키 (및 "행 번호"등)으로 ID를 고려하고, 이전 레코드와 각 레코드를 비교하는 데 사용했다. 다음 코드는 작동해야합니다.
CREATE SCHEMA temp create table temp.emp (id integer,name varchar(50), salary varchar(50)); insert into temp.emp values(1,'a','25000'); insert into temp.emp values(2,'b','30000'); insert into temp.emp values(3,'c','35000'); insert into temp.emp values(4,'d','40000'); insert into temp.emp values(5,'e','45000'); insert into temp.emp values(6,'f','20000'); select * from temp.emp SELECT current.id, current.name, current.salary, case when current.id = 1 then current.salary else case when current.salary > previous.salary then previous.salary else current.salary end end FROM temp.emp AS current LEFT OUTER JOIN temp.emp AS previous ON current.id = previous.id + 1
from https://stackoverflow.com/questions/1259458/sql-pulling-a-row-for-next-or-previous-row-of-a-current-row by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] DATE에 시간대와 오라클 변환 TIMESTAMP (0) | 2020.06.09 |
---|---|
[SQL] 다른 컬럼에서 순서에 따라 그룹에서 하나 개의 값을 선택 (0) | 2020.06.09 |
[SQL] SQLite는 내부 조인 - 업데이트가 다른 테이블의 값을 사용하여 (0) | 2020.06.09 |
[SQL] ORDER BY는 먼저 숫자에 따라 알파벳 (0) | 2020.06.09 |
[SQL] 어떻게 열 및 업데이트 테이블의 값을 정렬하려면? (0) | 2020.06.09 |