여기 (그것으로 이동하고 a fiddle) 하나 개의 아이디어 :
;WITH MoneyComingIn AS
(
SELECT MIN(startdate) AS startdate, MAX(enddate) AS enddate,
SUM(amount) AS amount
FROM myTable
WHERE amount > 0
)
SELECT MIN(startdate) AS startdate, MAX(enddate) AS enddate,
SUM(amount) AS amount
FROM myTable
WHERE enddate < (SELECT startdate FROM MoneyComingIn)
UNION ALL
SELECT startdate, enddate, amount
FROM MoneyComingIn
UNION ALL
SELECT MIN(startdate) AS startdate, MAX(enddate) AS enddate,
SUM(amount) AS amount
FROM myTable
WHERE startdate > (SELECT enddate FROM MoneyComingIn)
그리고 두 번째, UNION
(fiddle)를 사용하지 않고 :
SELECT MIN(startdate), MAX(enddate), SUM(amount)
FROM
(
SELECT startdate, enddate, amount,
CASE
WHEN EXISTS(SELECT 1
FROM myTable b
WHERE b.id>=a.id AND b.amount > 0) THEN
CASE WHEN EXISTS(SELECT 1
FROM myTable b
WHERE b.id<=a.id AND b.amount > 0)
THEN 2
ELSE 1
END
ELSE 3
END AS partition_no
FROM myTable a
) x
GROUP BY partition_no
을 서면으로 내 생각하지만, Id
이 순서대로 있다고 가정합니다. 이것을 ROW_NUMBER() OVER(ORDER BY startdate)
으로 대체 할 수 있습니다.
select min(startdate), max(enddate), sum(amount) from paiements
where enddate < (select min(startdate) from paiements where amount >0)
union
select min(startdate), max(enddate), sum(amount) from paiements
where startdate >= (select min(startdate) from paiements where amount >0)
and enddate <= (select max(enddate) from paiements where amount >0)
union
select min(startdate), max(enddate), sum(amount) from paiements
where startdate > (select max(enddate) from paiements where amount >0)
을하지만보고 이런 종류의, 그것은 여러 쿼리를 사용하여 아마 더 명시 적입니다 : 그런
감사합니다. 나는 안드로이드 폰에서 질문을하려고 애썼다. –
그룹화를 원하십니까? –
0과 0이 아닌 연속적인 행을 그룹화하는 것처럼 보이지만 왜 5 월 행을 분리하지 않습니까? –