如果我有如下表集計表超過2列在T-SQL
Hour Clicks Conversions
12:00 2 0
1:00 3 2
2:00 1 1
我怎樣寫一個SELECT statment是dissaggrates它橫跨兩列,所以我得到:
12:00 1 0
12:00 1 0
1:00 1 0
1:00 1 1
1:00 1 1
2:00 1 1
如果我不能用SELECT來完成,我該如何編寫一個存儲過程來處理循環?
謝謝!
如果我有如下表集計表超過2列在T-SQL
Hour Clicks Conversions
12:00 2 0
1:00 3 2
2:00 1 1
我怎樣寫一個SELECT statment是dissaggrates它橫跨兩列,所以我得到:
12:00 1 0
12:00 1 0
1:00 1 0
1:00 1 1
1:00 1 1
2:00 1 1
如果我不能用SELECT來完成,我該如何編寫一個存儲過程來處理循環?
謝謝!
這個假設對於任何給定的值[Hour]
只會有一行。如果可能有重複,我會先聚合那些(我認爲源已經是某種聚合)。
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;
這不是最有效的方法,但可能足以讓你開始。
DECLARE @T TABLE (
Hour TIME
, Clicks INT
, Conversions INT
);
INSERT @T VALUES ('12:00', 2, 0);
INSERT @T VALUES ('1:00', 3, 2);
INSERT @T VALUES ('2:00', 1, 1);
DECLARE @Stage TABLE (
Hour TIME
, Clicks INT
, Conversions INT
);
DECLARE @MaxClicks INT;
SELECT @MaxClicks = MAX(Clicks) FROM @T;
DECLARE @ClickCount INT; SET @ClickCount = 1;
WHILE @ClickCount <= @MaxClicks
BEGIN
INSERT @Stage (Hour, Clicks, Conversions)
SELECT Hour, 1, CASE WHEN Conversions >= @ClickCount THEN 1 ELSE 0 END
FROM @T WHERE Clicks >= @ClickCount;
SET @ClickCount = @ClickCount + 1;
END;
SELECT * FROM @Stage ORDER BY Hour;
雖然不太可能(我只知道這是因爲我熟悉數據模型的類型),但如果轉換次數高於點擊次數一個小時?例如有人可能在3:59點擊並在4點01分購買。 – 2012-02-16 19:53:32
需要採取的措施...我會想象你的理貨表方法也會更加高效。 – JSR 2012-02-16 20:00:16
我這麼認爲。但請將它稱爲數字表格。這不是理解任何事情。 :-) – 2012-02-16 20:02:09
DECLARE @x TABLE ([Hour] TIME, Clicks INT, Conversions INT);
INSERT @x VALUES ('12:00',2,0),('13:00',3,2), ('14:00',1,1);
;WITH a as
(
SELECT [hour], 1 [unnessasary column], clicks, CASE WHEN clicks <= Conversions THEN 1 ELSE 0 END click, Conversions
FROM @x
UNION ALL
SELECT [hour], 1, clicks-1,CASE WHEN clicks-1 <= Conversions THEN 1 ELSE 0 END, Conversions
FROM a
WHERE clicks > 1
)
SELECT [hour],[unnessasary column], click
FROM a
ORDER BY 1
OPTION (maxrecursion 0)
創建一個CLR SP – 2012-02-16 19:33:39
+1有趣的問題。不是一個新的,但我花了幾分鐘時間想到解決方案,所以你得到了我的加薪。 :-) – 2012-02-16 20:01:05
我看不到似乎總是返回1的第二列的位置 – 2012-02-17 09:30:30