У меня есть набор данных, который имеет временные отметки для разных наборов групп.SQL Grouping by Ranges
Timestamp -- Group -- Value
---------------------------
1 -- A -- 10
2 -- A -- 20
3 -- B -- 15
4 -- B -- 25
5 -- C -- 5
6 -- A -- 5
7 -- A -- 10
Я хочу суммировать эти значения в Group
поле, но анализируется как он появляется в данных. Например, приведенные выше данные приведут к следующему выходу:
Group -- Sum
A -- 30
B -- 40
C -- 5
A -- 15
Я не хочу этого, что все, что я смог придумать на мой собственный до сих пор:
Group -- Sum
A -- 45
B -- 40
C -- 5
Используя Oracle 11g, это то, чем я до сих пор помчался. Я знаю, что это неправильно, я надеюсь, что я по крайней мере на правильном пути с RANK()
. В реальных данных записи с одной и той же группой могут быть разделены на две временные метки или 100; может быть одна запись в группе, или 100 последовательных. Это не имеет значения, мне они нужны.
WITH SUB_Q AS
(SELECT K_ID
, GRP
, VAL
-- GET THE RANK FROM TIMESTAMP TO SEPARATE GROUPS WITH SAME NAME
, RANK() OVER(PARTITION BY K_ID ORDER BY TMSTAMP) AS RNK
FROM MY_TABLE
WHERE K_ID = 123)
SELECT T1.K_ID
, T1.GRP
, SUM(CASE
WHEN T1.GRP = T2.GRP THEN
T1.VAL
ELSE
0
END) AS TOTAL_VALUE
FROM SUB_Q T1 -- MAIN VALUE
INNER JOIN SUB_Q T2 -- TIMSTAMP AFTER
ON T1.K_ID = T2.K_ID
AND T1.RNK = T2.RNK - 1
GROUP BY T1.K_ID
, T1.GRP
Можно ли сгруппировать таким образом? Как мне это сделать?
Это выглядит большим , и определенно получает меня, что мне нужно! Я отвечу на этот ответ, как только пройдет много времени. – Gaffi
Действительно красивое и чистое и удобное решение. – pvoosten