173 messaggi dal 18 gennaio 2008
Ciao a tutti,
ho un problema con una query che non riesco a risolvere.
Ho una tabella che tra i vari campi ha un campo datetime. Io devo selezionare solo le righe che per data hanno l'ora maggiore(ora presa sempre dallo stesso campo datetime).
Magari è una cavolata, ma non riesco a saltarci fuori.

Grazie
Tommaso
1.976 messaggi dal 27 luglio 2005
Contributi
salve Tommaso,
non so se ho ben compreso le tue esigenze... non hai neanche indicato che tipologia di RDBMS utilizzi, e personalmente, di seguito, mi basero' su SQL Server...
la mia comprensione e' che, avendo un insieme di righe, con date e orario diversi tra loro, tu richieda, per ogni giorno, eventualmente filtrato, ottenere la riga con orario maggiore...
se questo e' corretto, puoi effettuare una selezione di MAX(..) con raggruppamento per la parte "giorno" di ogni riga... vari modi per fare cio'... dal semplicissimo CONVERT(date, ...) a funzioni di estrazione DATEPART(...)... di seguito ho usato CONVERT, ma non ho verificato in effetti le implicazioni prestazionali, che ti consiglio comunque di verificare...
ottenuto questo risultato intermedio, avendo quindi, per ogni giorno, il riferimento all'orario maggiore, possiamo mettere in join la tabella originaria con il risultato intermedio (tramite una Common Table Expression), ottenendo quindi la proiezione richiesta...

di seguito, trivialmente,
SET NOCOUNT ON;
USE tempdb;
GO
CREATE TABLE dbo.t (
  Id int IDENTITY,
  dt datetime NOT NULL
  );
GO
INSERT INTO dbo.t (dt)
  VALUES ('2018-01-01 15:30:40'), ('2018-01-01 21:30:40'),
    ('2018-01-02 20:30:40'), ('2018-01-02 22:30:40'),
    ('2018-01-03 05:30:40'), ('2018-01-03 08:30:40');
GO
PRINT 'SELEZIONE, per ogni data, della Riga con Orario Maggiore';
SELECT CONVERT(date, t.dt) [DateRef], MAX(t.dt)
  FROM dbo.t t
  GROUP BY CONVERT(date, t.dt);

PRINT 'Combinando la SELEZIONE precedente con la tabella base, possiamo estrarre le righe referenziate da ogni singolo orario';
WITH cte AS (
  SELECT CONVERT(date, t.dt) [Date], MAX(t.dt) AS [DateReferral]
    FROM dbo.t t
    GROUP BY CONVERT(date, t.dt)
  )
  SELECT t.*
    FROM dbo.t t
      JOIN cte c ON c.[DateReferral] = t.[dt]
    ORDER by c.[Date];

GO
DROP TABLE dbo.t;
--<---------
SELEZIONE, per ogni data, della Riga con Orario Maggiore
DateRef    
---------- -----------------------
2018-01-01 2018-01-01 21:30:40.000
2018-01-02 2018-01-02 22:30:40.000
2018-01-03 2018-01-03 08:30:40.000

Combinando la SELEZIONE precedente con la tabella base, possiamo estrarre le righe referenziate da ogni singolo orario
Id          dt
----------- -----------------------
2           2018-01-01 21:30:40.000
4           2018-01-02 22:30:40.000
6           2018-01-03 08:30:40.000


salutoni

Andrea Montanari
http://www.hotelsole.com - http://www.hotelsole.com/asql/index.php
173 messaggi dal 18 gennaio 2008
Ha ragione. Il mio problema è su oracle. Ora sto tentando di tradurre la sua query per Oracle.

Grazie mille

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.