복붙노트

[SQL] SQL 현재 행의 다음 또는 이전 행에 대해 행을 당겨

SQL

SQL 현재 행의 다음 또는 이전 행에 대해 행을 당겨

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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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
    
  7. 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