복붙노트

[SQL] 어떻게 MySQL은 열이 지연합니까?

SQL

어떻게 MySQL은 열이 지연합니까?

다음 표를 고려 ​​:

SELECT id, value FROM table ORDER BY id ASC;
+-----+---------+
| id  | value   |
+-----+---------+
| 12  | 158     |
| 15  | 346     |
| 27  | 334     |
| 84  | 378     |
| 85  | 546     |
+-----+---------+

ID 열에 자동 증가하지만 격차가 포함되어 있습니다. 값 열 숫자이다.

나는 두 행 위의 값과 관련하여 값을 설정하여 시간이 지남에 따라 가치의 증가를보고 싶다. 즉, = 로우 ID에 대한 I가 로우 (27) 식 (334)의 값과 관련하여, 행 번호 = 85 (546)의 값을 설정할 85이다. 값은 행 ID에 대해 계산 될 수 = 85, 따라서 334분의 546 = 1.63473이다.

이것은 내가 달성하고자하는 결과입니다 :

SELECT id, value, ...;
+-----+---------+---------------------+
| id  | value   | value/lag(value, 2) | (the syntax value/lag(value, 2) is made up)
+-----+---------+---------------------+
| 12  | 158     | NULL                |
| 15  | 346     | NULL                |
| 27  | 334     | 2.11392             | (334/158=2.11392)
| 84  | 378     | 1.09248             | (378/346=1.09248)
| 85  | 546     | 1.63473             | (546/334=1.63473)
+-----+---------+---------------------+

어떻게 MySQL은 그러한 보온을 수행합니까?

그래서 단순히 t1.id = t2.id와 같은 테이블에 합류, ID 열에는 격차가 포함되어 있습니다 -이하지 않습니다 작동합니다.

해결법

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

    1.여기에 반환 당신이 MySQL의에서 원하는 것을하는 솔루션입니다

    여기에 반환 당신이 MySQL의에서 원하는 것을하는 솔루션입니다

    SET @a :=0;
    SET @b :=2;
    SELECT r.id, r.value, r.value/r2.value AS 'lag'
    FROM
    (SELECT if(@a, @a:=@a+1, @a:=1) as rownum, id, value FROM results) AS r
    LEFT JOIN
    (SELECT if(@b, @b:=@b+1, @b:=1) as rownum, id, value FROM results) AS r2
    ON r.rownum = r2.rownum
    

    MySQL은 5.1 두 번 행을 계산해야하므로이 아닌 자기처럼 그렇게되지는 수도로 단정 또는 확장으로, 하위 쿼리에 가입 않지만, 메이크업 지연을 간단하게 지정을한다.

    오라클을 사용하는 독자들을 위해 대신이 훨씬 용이합니다

    SELECT id, value, value/lag(value, 2) over (order by id) as lag from results;
    
  2. ==============================

    2.현재 하나는 '역사적'데이터를 얻을 원하는 위치에서 하나의 사이에 두 행이 따라 할 수 일시적 같은 것을 사용하여 데이터를 저장하는 데 사용할 변수를 perphaps :

    현재 하나는 '역사적'데이터를 얻을 원하는 위치에서 하나의 사이에 두 행이 따라 할 수 일시적 같은 것을 사용하여 데이터를 저장하는 데 사용할 변수를 perphaps :

    세트 @ oldid0 = 999999; 세트 @ oldid1 = 999999; 세트 @ oldid2 = 999999; ID 오름차순 의해 나타난 순서에서 ID = 가치 / @ oldid0; = @ oldid1 @ oldid1 : = @ oldid2 @ oldid2 @ oldid0를 선택

    그것은 매우 어수선한 솔루션입니다하지만 난 그 일을 할 것이라 생각합니다. 어쩌면 표시되는 변수를 방지하는 몇 가지 방법이, 나는 멀리 그 들여다 적이 없다.

  3. from https://stackoverflow.com/questions/5483319/how-do-i-lag-columns-in-mysql by cc-by-sa and MIT license