Thread View: pl.comp.bazy-danych
4 messages
4 total messages
Started by Marcin G.
Thu, 27 Oct 2016 11:50
[MS SQL] Usuwanie rekordów oprócz tych najbliższych danej godziny.
Author: Marcin G.
Date: Thu, 27 Oct 2016 11:50
Date: Thu, 27 Oct 2016 11:50
9 lines
1369 bytes
1369 bytes
Jak w temacie, jest tabela z wpisami robionymi np. co kilkanaście s. Jak napisać zapytanie usuwające rekordy poza tymi, które są najbliższe danej godziny np. północy? Czyli z każdego dnia ma zostać jeden rekord zarejestrowany najbliżej północy. Pole określające datę wpisu jest typu datetime. Pozdrawiam, Marcin G.
Re: [MS SQL] Usuwanie rekordów oprócz tych najbliższych danej godziny.
Author: M.M.
Date: Thu, 27 Oct 2016 15:46
Date: Thu, 27 Oct 2016 15:46
19 lines
2095 bytes
2095 bytes
On Thursday, October 27, 2016 at 1:50:41 PM UTC+2, Marcin G. wrote: > Jak w temacie, jest tabela z wpisami robionymi np. co kilkanaście s. Jak > napisać zapytanie usuwające rekordy poza tymi, które są najbliższe danej > godziny np. północy? Czyli z każdego dnia ma zostać jeden rekord > zarejestrowany najbliżej północy. > Pole określające datę wpisu jest typu datetime. > > > Pozdrawiam, > Marcin G. Trzeba w napisać odpowiedni warunek. Coś w rodzaju: delete ... where id not in ( select id from ( select id, distinct(date) from table order by abs( date - date_time ) ) ) Pozdrawiam
Re: [MS SQL] Usuwanie rekordów oprócz tych najbliższych danej godziny.
Author: geos
Date: Fri, 28 Oct 2016 07:25
Date: Fri, 28 Oct 2016 07:25
42 lines
2835 bytes
2835 bytes
On 27.10.2016 13:50, Marcin G. wrote: > Jak w temacie, jest tabela z wpisami robionymi np. co kilkanaście s. Jak > napisać zapytanie usuwające rekordy poza tymi, które są najbliższe danej > godziny np. północy? Czyli z każdego dnia ma zostać jeden rekord > zarejestrowany najbliżej północy. > Pole określające datę wpisu jest typu datetime. nie pracuję na sql serverze, ale widze w dokumentacji, ze jest funkcja first_value: https://msdn.microsoft.com/en-us/library/hh213018.aspx pozwoli Ci ona uzyskać wartości z rekordów, które są najbliżej jakiejś godziny. w ogólności mogą to być dwa rekordy (np. sekunda przed i sekunda po północy są tak samo "oddalone" od północy). poniższy sql działa dla oracle ale łatwo przerobisz na sql server. zwroci jedną wartość z puli rekordów "najbliższych" północy. jeśli chcesz aby było to bardziej deterministyczne dodaj do order by jeszcze jeden warunek priorytetyzujący np. znak różnicy miedzy północą a kolumną datetime. select distinct first_value(t) over (order by abs(trunc(sysdate)-t)) from tabela; jeśli chcesz aby np. takie usuwania odbywało się w jakimś cyklu, np. dziennym i aby pozostawał tylko jeden rekord dziennie to powyższe zapytanie powinieneś uzupełnić o klauzule partition by: select distinct first_value(t) over (partition by trunc(t) order by abs(trunc(sysdate)-t)) from tabela; distinct jest opcjonalny. umieszczając powyższe jako podzapytanie usuniesz wszystkie rekordy i zostawisz po jednym rekordzie najbliższym północy: delete from tabela where t is not in ( <podzapytanie> ); pozdrawiam geos
Re: [MS SQL] Usuwanie rekordów oprócz tych najbliższych danej godziny.
Author: Marcin G.
Date: Fri, 28 Oct 2016 08:20
Date: Fri, 28 Oct 2016 08:20
44 lines
2968 bytes
2968 bytes
Użytkownik "geos" napisał w wiadomości grup dyskusyjnych:5812fd64$0$5146$65785112@news.neostrada.pl... > nie pracuję na sql serverze, ale widze w dokumentacji, ze jest funkcja > first_value: > > https://msdn.microsoft.com/en-us/library/hh213018.aspx > > pozwoli Ci ona uzyskać wartości z rekordów, które są najbliżej jakiejś > godziny. w ogólności mogą to być dwa rekordy (np. sekunda przed i sekunda > po północy są tak samo "oddalone" od północy). > > poniższy sql działa dla oracle ale łatwo przerobisz na sql server. zwroci > jedną wartość z puli rekordów "najbliższych" północy. jeśli chcesz aby > było to bardziej deterministyczne dodaj do order by jeszcze jeden warunek > priorytetyzujący np. znak różnicy miedzy północą a kolumną datetime. > > select distinct first_value(t) over (order by abs(trunc(sysdate)-t)) > from tabela; > > jeśli chcesz aby np. takie usuwania odbywało się w jakimś cyklu, np. > dziennym i aby pozostawał tylko jeden rekord dziennie to powyższe > zapytanie powinieneś uzupełnić o klauzule partition by: > > select distinct first_value(t) over (partition by trunc(t) order by > abs(trunc(sysdate)-t)) > from tabela; > > distinct jest opcjonalny. umieszczając powyższe jako podzapytanie usuniesz > wszystkie rekordy i zostawisz po jednym rekordzie najbliższym północy: > > delete from tabela > where t is not in ( <podzapytanie> ); > > pozdrawiam > geos Dzięki. Po przeróbkach działa tak jak chciałem. Pozdrawiam, Marcin G.
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads