[SQL] MySQL은 시뮬레이션 지연 기능
SQLMySQL은 시뮬레이션 지연 기능
| 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.이것은 내가 가장 좋아하는 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.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.원하는 결과를 얻으려면, 먼저 각 회사의 마지막 타임 스탬프에 마지막과 다음을 찾을 필요가있다. 그것은 다음과 같은 쿼리와 매우 간단합니다 :
원하는 결과를 얻으려면, 먼저 각 회사의 마지막 타임 스탬프에 마지막과 다음을 찾을 필요가있다. 그것은 다음과 같은 쿼리와 매우 간단합니다 :
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에 작동합니다.
from https://stackoverflow.com/questions/11303532/simulate-lag-function-in-mysql by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 어떻게 SQL 쿼리를 사용하여 쉼표로 구분 된 목록을 만들려면 어떻게해야합니까? (0) | 2020.03.16 |
---|---|
[SQL] 두 개의 서로 다른 데이터베이스에 테이블을 사이에 가입? (0) | 2020.03.16 |
[SQL] MySQL의 문자열과 함께 작업에) (폭발의 등가 (0) | 2020.03.16 |
[SQL] 사용하여 하위 쿼리 * 1를 존재하거나 존재 (0) | 2020.03.16 |
[SQL] WHERE 절에 알 수없는 열 (0) | 2020.03.16 |