jak kiedy to robię
SELECT [Date]
FROM [FRIIB].[dbo].[ArchiveAnalog]
GROUP BY [Date]
jak mogę określić okres dla grupy?
MS SQL 2008
2nd Edit
Próbuję
SELECT MIN([Date]) AS RecT, AVG(Value)
FROM [FRIIB].[dbo].[ArchiveAnalog]
GROUP BY (DATEPART(MINUTE, [Date]) / 10)
ORDER BY RecT
zmieniono% 10 na / 10. czy można wyprowadzić datę bez milisekund?
ROUND((DATEPART(MINUTE, DT.[Date]) / 5),0,1) * 5
tak, że kiedy patrzę na dane, jest to skorelowane z najbliższym przedziałem czasowymDATE(DT.[Date])
.datepart(hour, workingPolicy.workingHours)/2.0
daje1.5
podczasdatepart(hour, '1900-01-01 09:00:30.000')/2.0
daje4.5
, nie rozumiem dlaczego? Uwaga: workingPolicy.workingHours = 1900-01-01 09: 00: 30.000 . proszę o pomocJestem bardzo spóźniony na imprezę, ale to nie pojawia się w żadnej z istniejących odpowiedzi:
10
iMINUTE
terminy mogą zostać zmienione na dowolną liczbę iDATEPART
odpowiednio.DATETIME
wartość, która oznacza:SELECT
instrukcji da wynikowi kolumnę z ładnymi danymi wyjściowymi obciętymi na określonym poziomie.'2000'
to „data zakotwiczenia”, wokół której SQL wykona obliczenia związane z datą. Jereonh odkrył poniżej, że przy poprzedniej funkcji anchor (0
) napotykasz przepełnienie liczb całkowitych, gdy grupujesz ostatnie daty według sekund lub milisekund. †Jeśli Twoje dane obejmują stulecia, ‡ używanie pojedynczej daty zakotwiczenia dla grupowania w sekundach lub milisekundach nadal spowoduje przepełnienie. Jeśli tak się dzieje, możesz poprosić każdy wiersz o zakotwiczenie porównania kategoryzacji do północy jego własnej daty:
Użyj
DATEADD(DAY, DATEDIFF(DAY, 0, aa.[date]), 0)
zamiast tego,'2000'
gdzie pojawia się powyżej. Twoje zapytanie będzie całkowicie nieczytelne, ale zadziała.Alternatywą może być
CONVERT(DATETIME, CONVERT(DATE, aa.[date]))
zamiana.† 2 32 ≈ 4,29E + 9, więc jeśli tak
DATEPART
jestSECOND
, zyskujesz 4,3 miliarda sekund w każdą stronę, czyli „kotwicę ± 136 lat”. Podobnie, 2 32 milisekundy to ≈ 49,7 dnia.‡ Jeśli Twoje dane obejmują stulecia lub milenia i nadal są dokładne z dokładnością do sekundy lub milisekundy… gratulacje! Cokolwiek robisz, rób to dalej.
źródło
where
klauzulę przedgroup by
./ 20 * 20
będzie taka sama, jak zbieranie danych w 20-minutowych odstępach? Przepraszam, w tej chwili walczę z matematyką.The datediff function resulted in an overflow. The number of dateparts separating two date/time instances is too large. Try to use datediff with a less precise datepart.
). Wydaje się, że MINUTA to najmniejsza pora daty, której możesz użyć w tym podejściu.0
do'2000'
(cudzysłowy są ważne!) i spróbujSECOND
ponownie.W T-SQL możesz:
lub
na minutę użytkowania
DATEPART(mi, [Date])
lub
po 10 minutach użycia
DATEPART(mi, [Date]) / 10
(jak zasugerował Timothy)źródło
Przez 10 minut zrobiłbyś to
Jak już wspominali tzup i Pieter888 ... po prostu zrobić godzinną przerwę
źródło
Powinno być coś takiego
(Nie jestem w 100% pewien składni - jestem bardziej typem z Oracle)
W Oracle:
źródło
Oryginalna odpowiedź, której udzielił autor, działa całkiem nieźle. Aby rozszerzyć ten pomysł, możesz zrobić coś takiego
co pozwoli ci na grupowanie w dłuższym okresie niż 60 minut, powiedzmy 720, czyli pół dnia itd.
źródło
Dla MySql:
źródło
Moim rozwiązaniem jest użycie funkcji do utworzenia tabeli z przedziałami dat, a następnie dołączenie tej tabeli do danych, które chcę zgrupować, używając przedziału dat w tabeli. Przedział dat można wtedy łatwo wybrać podczas prezentacji danych.
źródło
źródło
W przypadku programu SQL Server 2012, chociaż uważam, że będzie działać w programie SQL Server 2008R2, używam następującego podejścia, aby skrócić czas do milisekundy:
Działa to poprzez:
@ms = DATEDIFF(MILLISECOND, CAST(time AS DATE), time)
@rms = @ms % @msPerSlice
DATEADD(MILLISECOND, -@rms, time)
Niestety, ponieważ przepełnia to mikrosekundami i mniejszymi jednostkami, więc większe, dokładniejsze zestawy danych wymagałyby użycia mniej wygodnego stałego punktu.
Nie przeprowadziłem rygorystycznych testów porównawczych i nie jestem w dużych danych, więc Twój przebieg może się różnić, ale wydajność nie była zauważalnie gorsza niż inne metody wypróbowane na naszym sprzęcie i zestawach danych, a wypłata w wygodzie programisty za dowolne cięcie sprawia, że warto dla nas.
źródło
zamień dwie 600 na dowolną liczbę sekund, którą chcesz zgrupować.
Jeśli potrzebujesz tego często, a tabela się nie zmienia, jak sugeruje nazwa Archive, prawdopodobnie byłoby nieco szybciej przekonwertować i zapisać datę (i czas) jako unikatowy czas w tabeli.
źródło
Wiem, że spóźniłem się na występ z tym, ale zastosowałem to - całkiem proste podejście. Pozwala to uzyskać 60-minutowe plasterki bez problemów z zaokrąglaniem.
źródło
źródło