I'm not sure how to solve this
CodePudding user response:
DROP TABLE IF EXISTS newtable;
CREATE TABLE newtable
(
DateD DATE NOT NULL,
Child VARCHAR(10)NOT NULL,
SweetsEaten TINYINT NOT NULL
)
INSERT INTO newtable ( DateD, Child, SweetsEaten)
VALUES ('20220101', 'Tom', 3),
('20220102', 'Jane', 2),
('20220111', 'Leslie', 1),
('20220214', 'Tom', 0),
('20220218', 'Jane', 5),
('20220201', 'Leslie', 1),
('20220307', 'Leslie', 3 ),
( '20220309', 'Tom', 2),
('20220318', 'Jane', 0);
SELECT TOP 1 WITH TIES * FROM
(
SELECT N.DateD,N.Child,N.SweetsEaten,
SUM(N.SweetsEaten)OVER(PARTITION BY N.Child ORDER BY N.DateD ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)XCOL
FROM newtable AS N
) X WHERE X.XCOL>=5
ORDER BY ROW_NUMBER()OVER(PARTITION BY X.Child ORDER BY XCOL ASC)
Hope the above is suitable for you (SQL Server 2017)
CodePudding user response:
The inner from is the cumulative sum of sweets, so you only need to select the first occurrence, MIN(Date), when the cumulative sum is greater then 5.
SELECT
Child,
MIN(Date)
FROM (
SELECT
Child,
DATE,
SUM(SweetsEaten) OVER(PARTITION BY Child ORDER BY Date) AS SweetsEatenToDate
FROM table1
)
WHERE SweetsEatenToDate >= 5
GROUP BY Child
The cumulative sum reads like this:
Your SUMing all the sweets PARTIONing them BY Child ORDERed BY Date

