programing

MySQL에서 지연 함수 시뮬레이션

megabox 2023. 7. 23. 14:10
반응형

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  

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

지연 함수를 에뮬레이트하는 방법은 다음과 같습니다.

SET @quot=-1;
select time,company,@quot lag_quote, @quot:=quote curr_quote
  from stocks order by company,time;
  • lag_quote이전 행의 따옴표 값을 보유합니다.첫 번째 행의 경우 @quot는 -1입니다.
  • curr_quote현재 행의 따옴표 값을 보유합니다.

주의:

  1. order by절은 일반 창 함수에서와 마찬가지로 여기서 중요합니다.
  2. 다음 시간에 지연을 사용할 수도 있습니다.company단지 당신이 동일한 견적의 차이를 계산하고 있는지 확인하기 위해.company.
  3. 동일한 방법으로 행 카운터를 구현할 수도 있습니다.@cnt:=@cnt+1

이 계획의 좋은 점은 애플리케이션 서버에서 집계 함수, 저장 프로시저 또는 데이터 처리와 같은 일부 다른 접근 방식에 비해 계산적으로 매우 희박하다는 것입니다.

편집:

이제 귀하가 언급한 형식으로 결과를 얻을 수 있는지에 대한 질문을 시작하겠습니다.

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;

중첩은 상호 관련이 없기 때문에 보이는 것만큼 나쁘지 않습니다. (통사적으로) :)

이것에 대해 도움이 필요하시면 말씀해주세요.

MySQL 8.0 이상에서는 시뮬레이션할 필요가 없습니다.LAG기본적으로 지원됩니다.

기능:

파티션 내에서 현재 행을 N개씩 지연(앞에)시키는 행의 expr 값을 반환합니다.해당 행이 없으면 반환 값이 기본값입니다.예를 들어, N이 3이면 처음 두 행에 대한 반환 값이 기본값입니다.N 또는 기본값이 없는 경우 기본값은 각각 1 및 NULL입니다.

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

DB Fidle 데모

원하는 결과를 얻으려면 먼저 각 회사의 마지막 타임스탬프와 마지막 타임스탬프 옆에 있는 타임스탬프를 찾아야 합니다.다음 쿼리를 사용하면 매우 간단합니다.

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 Fiddle에서 결과를 확인할 수 있습니다.

이 쿼리는 표준 SQL 기능만 사용하며 모든 RDBMS에서 작동해야 합니다.

언급URL : https://stackoverflow.com/questions/11303532/simulate-lag-function-in-mysql

반응형