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
현재 행의 따옴표 값을 보유합니다.
주의:
order by
절은 일반 창 함수에서와 마찬가지로 여기서 중요합니다.- 다음 시간에 지연을 사용할 수도 있습니다.
company
단지 당신이 동일한 견적의 차이를 계산하고 있는지 확인하기 위해.company
. - 동일한 방법으로 행 카운터를 구현할 수도 있습니다.
@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;
원하는 결과를 얻으려면 먼저 각 회사의 마지막 타임스탬프와 마지막 타임스탬프 옆에 있는 타임스탬프를 찾아야 합니다.다음 쿼리를 사용하면 매우 간단합니다.
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 기능만 사용하며 모든 RDBMS에서 작동해야 합니다.
언급URL : https://stackoverflow.com/questions/11303532/simulate-lag-function-in-mysql
'programing' 카테고리의 다른 글
Spark Dataframe은 중복된 이름을 가진 열을 구분합니다. (0) | 2023.07.23 |
---|---|
데이터 프레임의 여러 데이터 그룹을 하나의 그림으로 표시하는 방법 (0) | 2023.07.23 |
오라클 업데이트 문에서 테이블 이름 대신 하위 조회 사용 (0) | 2023.07.23 |
Varchar의 인덱스는 성능에 차이가 있습니까? (0) | 2023.07.23 |
Python에서 "ImportError: No module name..." 오류를 해결하는 방법은 무엇입니까? (0) | 2023.07.23 |