결과를 얻는 데는 몇 가지 방법이 있습니다. 결과 집합에 여분의 열과 열의 순서로 살 수 있다면 다음과 같이 실행 가능한 접근 방식입니다.
하여 사용자 변수
SELECT d.Date
, IF(@prev_units IS NULL
,@diff := 0
,@diff := d.units - @prev_units
) AS `Units_used`
, @prev_units := d.units AS `Units`
FROM (SELECT @prev_units := NULL) i
JOIN (
SELECT t.Date, t.Units
FROM mytable t
ORDER BY t.Date, t.Units
) d
이 지정된 결과 집합을 반환하지만, 그뿐만 아니라 단위 칼럼을 포함한다. MySQL은 인라인 뷰를 처리하는 방식 (MySQL은 "파생 테이블"이라고 부름) 때문에 컬럼이 필터링 될 수는 있지만 비용이 더 많이 듭니다.
다른 컬럼을 제거하려면 다른 쿼리에서이를 감쌀 수 있습니다 ...
SELECT f.Date
, f.Units_used
FROM (
query from above goes here
) f
ORDER BY f.Date
그러나 다시, 그 열을 제거하는 두 번째 결과 집합 구체화의 추가 비용이 함께 제공됩니다.
A는 당신이 각 Date
값을 하나의 행이 보장되는 경우
, 중 하나 DATE로 저장하거나, 상수로 설정 timecomponent와 DATETIME 같은 반에 참여하여, 누락 된 날짜 값이 있다면
SELECT t.Date
, t.Units - s.Units AS Units_Used
FROM mytable t
LEFT
JOIN mytable s
ON s.Date = t.Date + INTERVAL -1 DAY
ORDER BY t.Date
: 같은 자정 및 날짜 값에 빈틈이없는, 그리고 날짜로, DATE 또는 DATETIME 데이터 타입으로 점은 지정된 결과 집합을 반환 한 후 다른 쿼리를 정의 일치하는 이전 행이 없도록 간격 (간격)을 지정하면 Units_used는 NULL 값을가집니다.
상관 하위 쿼리
당신이 아니오 "실종 날짜"의 보증이없는 경우를 사용하여,하지만 당신은 더 이상 특정 날짜에 대한 행 하나 이상이 없다는 것을 보증을 가지고, 다음 다른 접근 방식 (성능면에서 일반적으로 더 비싼)는 상관 하위 쿼리 사용하는 것입니다
SELECT t.Date
, (t.Units - (SELECT s.Units
FROM mytable s
WHERE s.Date < t.Date
ORDER BY s.Date DESC
LIMIT 1)
) AS Units_used
FROM mytable t
ORDER BY t.Date, t.Units
단위와 units_used의 관계는 무엇입니까? – 7alhashmi
@ 7alhashmi : units_used는 SQL 결과의 단위 별칭입니다. –
나는 단위 열에서 unit_used를 얻는 방법을 의미합니까? – 7alhashmi