Mariusz Z.

Mariusz Z. Główny Specjalista
ds. Monitorowania
Wskaźników

Temat: Pomoc w napisaniu zapytania

Mam tabele

Dane1 Dane2 DataGodzina
1 57 201204260000
3 54 201204260015
5 51 201204260030
7 48 201204260045
9 45 201204260100
11 42 201204260115
13 39 201204260130
15 36 201204260145
17 33 201204260200
19 30 201204260215
21 27 201204260230
23 24 201204260245
25 21 201204260300
27 18 201204260315
29 15 201204260330
31 12 201204260345
33 9 201204260400
35 6 201204260415
37 3 201204260430
39 0 201204260445
41 1 201204260500
43 3 201204260515
45 5 201204260530
47 10 201204260545
49 15 201204260600
51 20 201204260615
53 25 201204260630
55 35 201204260645
57 32 201204260700

Agregacja daty i godziny jest co 15 min, potrzebuje sumować wartości tak aby była agregacja co 30min.
Czyli oczkuje rezultatu:

Dane1 Dane2 DataGodzina
1 57 201204260000
8 105 201204260030
16 93 201204260100
24 81 201204260130
32 69 201204260200
40 57 201204260230
48 45 201204260300
56 33 201204260330
64 21 201204260400
72 9 201204260430
80 1 201204260500
88 8 201204260530
96 25 201204260600
104 45 201204260630
112 67 201204260700

konto usunięte

Temat: Pomoc w napisaniu zapytania

Fajne zadanko:) To mój pierwszy pomysł z użyciem row_number. Do każdego wiersza przyporządkowuję numer wiersza zgodnie z kolejnością daty i następnie - klucz rozwiązania - grupuję po dzieleniu całkowitym numeru wiersza przez 2, dzięki czemu dwa sąsiednie wiersze wypadają razem.
Całość opakowana w CTE (typowo dla window function)
with CTE_agg as (
select
Dane1,Dane2,
DataGodzina,
row_number() over (order by DataGodzina asc) rn
from dbo.aaa
)
select
max(DataGodzina),
sum(Dane1),
sum(Dane2)
from CTE_agg
group by rn/2;

konto usunięte

Temat: Pomoc w napisaniu zapytania

Trochę ryzykowne. Jakakolwiek nieciągłość spowoduje przekłamania.

Ja bym zamienił dwa ostatnie znaki daty na 30 dla 15, na 00 dla 45 i pogrupował po wyniku tej zamiany.

jakoś tak (piszę bez SSMSa, także mogę kręcić)

SELECT
SUM(Dana1),
SUM(Dana2),
CASE RIGHT(DataGodzina,2)
WHEN '15' THEN LEFT(DataGodzina,10)+'30'
WHEN '45' THEN LEFT(DataGodzina,10)+'00'
ELSE DataGodzina
END
FROM dbo.aaa
GROUP BY CASE RIGHT(DataGodzina,2)
WHEN '15' THEN LEFT(DataGodzina,10)+'30'
WHEN '45' THEN LEFT(DataGodzina,10)+'00'
ELSE DataGodzina
END

pozdrawiam
Piotr B.

Piotr B. Handlarz też
człowiek

Temat: Pomoc w napisaniu zapytania

a może użyjcie TOAD for SQL Server albo TOAD for Data Analysts?
Bartosz Ślepowronski

Bartosz Ślepowronski Problem? Jaki
problem?

Temat: Pomoc w napisaniu zapytania

Piotr B.:
a może użyjcie TOAD for SQL Server albo TOAD for Data Analysts?

To TOAD już sam takie probemy rozwiązuje? Nieźle.
Piotr B.

Piotr B. Handlarz też
człowiek

Temat: Pomoc w napisaniu zapytania

Bartosz Ślepowronski:
To TOAD już sam takie probemy rozwiązuje? Nieźle.

Sam TOAD nie rozwiązuje - bo do tego to trzeba mieć kiepełe.
Ale może ułatwi rozwiązanie?

Następna dyskusja:

SQL - pomoc w napisaniu zap...




Wyślij zaproszenie do