🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.bazy-danych
Article #195128

Re: [MS SQL] Usuwanie rekordów oprócz tych najbliższych danej godziny.

#195128
From: geos
Date: Fri, 28 Oct 2016 07:25
42 lines
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
Technical Details
Message-ID: <5812fd64$0$5146$65785112@news.neostrada.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!news.nask.pl!news.nask.org.pl!news.unit0.net!cyclone02.ams2!voer-me.highwinds-media.com!peer02.am4!peer.am4.highwinds-media.com!peer03.fr7!futter-mich.highwinds-media.com!news.highwinds-media.com!newsfeed.neostrada.pl!unt-exc-01.news.neostrada.pl!unt-spo-a-01.news.neostrada.pl!news.neostrada.pl.POSTED!not-for-mail
References: <5811ea0f$0$5164$65785112@news.neostrada.pl>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!news.nask.pl!news.nask.org.pl!news.unit0.net!cyclone02.ams2!voer-me.highwinds-media.com!peer02.am4!peer.am4.highwinds-media.com!peer03.fr7!futter-mich.highwinds-media.com!news.highwinds-media.com!newsfeed.neostrada.pl!unt-exc-01.news.neostrada.pl!unt-spo-a-01.news.neostrada.pl!news.neostrada.pl.POSTED!not-for-mail
Subject: Re: [MS SQL] Usuwanie rekordów oprócz tych
 najbliższych danej godziny.
Newsgroups: pl.comp.bazy-danych
References: <5811ea0f$0$5164$65785112@news.neostrada.pl>
From: geos <geos@SPAMPRECZ.autograf.pl>
Date: Fri, 28 Oct 2016 09:25:24 +0200
MIME-Version: 1.0
In-Reply-To: <5811ea0f$0$5164$65785112@news.neostrada.pl>
Lines: 44
Message-ID: <5812fd64$0$5146$65785112@news.neostrada.pl>
Organization: Telekomunikacja Polska
NNTP-Posting-Host: 093105185217.warszawa.vectranet.pl
X-Trace: 1477639524 unt-rea-a-01.news.neostrada.pl 5146 93.105.185.217:34700
X-Complaints-To: abuse@news.neostrada.pl
X-Received-Body-CRC: 2210211190
X-Received-Bytes: 2669
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit