복붙노트

[SQL] MySQL은 시뮬레이션 지연 기능

SQL

MySQL은 시뮬레이션 지연 기능

| time                | company | quote |
+---------------------+---------+-------+
| 0000-00-00 00:00:00 | GOOGLE  |    40 |
| 2012-07-02 21:28:05 | GOOGLE  |    60 |
| 2012-07-02 21:28:51 | SAP     |    60 |
| 2012-07-02 21:29:05 | SAP     |    20 |

어떻게 예를 들어, 따옴표의 차이를 인쇄 할 MySQL의에서이 테이블에 지연을합니까 :

GOOGLE | 20
SAP    | 40  

해결법

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

    1.이것은 내가 가장 좋아하는 MySQL의 해킹이다.

    이것은 내가 가장 좋아하는 MySQL의 해킹이다.

    이것은 당신이 지연 기능을 에뮬레이션하는 방법입니다 :

    SET @quot=-1;
    select time,company,@quot lag_quote, @quot:=quote curr_quote
      from stocks order by company,time;
    

    노트:

    이 제도의 좋은 점은 매우 응용 프로그램 서버에서 데이터를 집계 함수, 저장 프로 시저를 사용하거나 처리하는 등의 다른 방법에 비해 린 계산이다.

    편집하다:

    이제 당신이 언급 한 형식으로 결과를 얻기의 질문에 오는 :

    SET @quot=0,@latest=0,company='';
    select B.* from (
    select A.time,A.change,IF(@comp<>A.company,1,0) as LATEST,@comp:=A.company as company from (
    select time,company,quote-@quot as change, @quot:=quote curr_quote
    from stocks order by company,time) A
    order by company,time desc) B where B.LATEST=1;
    

    중첩 공동 관련된 그렇지 않다되지는 (구문) 보이는대로 (계산) 불량으로 :)

    당신이 어떤 도움이 필요하면 알려주세요.

  2. ==============================

    2.MySQL의 8.0에서와 위의 시뮬레이션 LAG에 대한 필요가 없습니다. 그것은 기본적으로 지원됩니다

    MySQL의 8.0에서와 위의 시뮬레이션 LAG에 대한 필요가 없습니다. 그것은 기본적으로 지원됩니다

    SELECT
         company,
         quote,
         LAG(quote) OVER(PARTITION BY company ORDER BY time) AS prev_quote
    FROM tab;
    

    DB 휘티 d 혀라도

  3. ==============================

    3.원하는 결과를 얻으려면, 먼저 각 회사의 마지막 타임 스탬프에 마지막과 다음을 찾을 필요가있다. 그것은 다음과 같은 쿼리와 매우 간단합니다 :

    원하는 결과를 얻으려면, 먼저 각 회사의 마지막 타임 스탬프에 마지막과 다음을 찾을 필요가있다. 그것은 다음과 같은 쿼리와 매우 간단합니다 :

    SELECT c.company, c.mts, max(l.ts) AS lts
      FROM (SELECT company, max(ts) AS mts FROM cq GROUP BY company) AS c
      LEFT JOIN cq l
        ON c.company = l.company AND c.mts > l.ts
     GROUP BY c.company, c.mts;
    

    지금 당신은 원하는 결과를 얻을 수있는 원래의 테이블이 하위 쿼리에 가입해야합니다 :

    SELECT c.company, l.quote, coalesce(l1.quote, 0),
           (l.quote - coalesce(l1.quote, 0)) AS result
      FROM (SELECT c.company, c.mts, max(l.ts) AS lts
          FROM (SELECT company, max(ts) AS mts FROM cq GROUP BY company) AS c
          LEFT JOIN cq l
            ON c.company = l.company AND c.mts > l.ts
         GROUP BY c.company, c.mts) AS c
      LEFT JOIN cq AS l ON l.company = c.company AND l.ts = c.mts
      LEFT JOIN cq AS l1 ON l1.company = c.company AND l1.ts = c.lts;
    

    당신은 SQL 바이올린에 결과를 관찰 할 수있다.

    이 쿼리는 표준 SQL 기능을 사용하고있는 RDBMS에 작동합니다.

  4. from https://stackoverflow.com/questions/11303532/simulate-lag-function-in-mysql by cc-by-sa and MIT license