Zakłada się, że będzie tylko jeden wiersz dla dowolnej wartości [Hour]
. Jeśli mogą istnieć duplikaty, zbiorę je najpierw (zakładam, że źródło jest już agregacją jakiegoś rodzaju).
DECLARE @x TABLE ([Hour] CHAR(5), Clicks INT, Conversions INT);
INSERT @x SELECT '12:00',2,0
UNION ALL SELECT '13:00',3,2
UNION ALL SELECT '14:00',1,1;
;WITH x AS
(
SELECT n = ROW_NUMBER() OVER (ORDER BY s1.[object_id]) FROM sys.all_columns AS s1
-- CROSS JOIN (SELECT 1 UNION ALL SELECT 2) AS s2 -- to double the rows if you need more
),
y AS
(
SELECT [Hour], Conversions, Clicks,
m = MAX(CASE WHEN Conversions > Clicks THEN Conversions ELSE Clicks END)
FROM @x GROUP BY [Hour], Conversions, Clicks
)
SELECT y.[Hour],
Clicks = CASE WHEN Clicks < x.n THEN 0 ELSE 1 END,
Conversions = CASE WHEN Conversions < x.n THEN 0 ELSE 1 END
FROM x INNER JOIN y ON x.n <= y.m
ORDER BY CONVERT(TIME, y.[Hour]), Clicks, Conversions;
Tworzenie CLR SP –
+1 ciekawy problem. Nie nowy, ale zajęło mi to kilka minut, aby wymyślić rozwiązanie, więc otrzymasz ode mnie ode mnie głosowanie. :-) –
Nie widzę punktu drugiej kolumny, która wydaje się zawsze zwracać 1 –