none
Trovare la data minima o massima su di una singola riga RRS feed

  • Domanda

  • Salve ragazzi non so quanto può essere sciocca o no questa domanda.

    Esiste un sistema rapido per trovare la data più piccola o viceversa se si hanno più valori su una singola riga?

    esempio

    select date1, date2, date3, date4, date5 from table1 where param = 1

    ovviamente ho solo un record in risposta di 5 valori, ma come estrarre tra di loro la data più piccola o viveversa

    Grazie

    martedì 20 maggio 2014 07:19

Risposte

  • Vorrei riaprire questo thread per sapere se è possibile sapere anche il nome o numero della colonna che viene restituita

    grazie a tutti e non uccidetemi

    Ma se la soluzione UNPIVOT la scrivi così:

    SELECT TOP 1
    	colData
    	, nDate
    FROM    
    	#Date 
    	UNPIVOT (colData FOR nDate IN (data1, data2, data3, data4, data5)) as UNP
    WHERE
    	id = 1
    ORDER BY
    	colData

    risolvi?


    vibi6

    • Contrassegnato come risposta brggpr lunedì 22 dicembre 2014 09:38
    venerdì 19 dicembre 2014 22:02

Tutte le risposte

  • Ciao, al volo mi vengono in mente due soluzioni.

    1- Sfrutti un CASE 

    2- Fai una UNION di cinque select dove ogni volta prendi un campo diverso e poi applichi MIN() per selezionare il record più piccolo.

    DECLARE @p int
    
    SET @p=1
    
    SELECT MIN(d) FROM (
    SELECT date1 AS d FROM table1 WHERE param=@p
    UNION
    SELECT date2 AS d FROM table1 WHERE param=@p
    UNION
    SELECT date3 AS d FROM table1 WHERE param=@p
    UNION
    SELECT date4 AS d FROM table1 WHERE param=@p
    UNION
    SELECT date5 AS d FROM table1 WHERE param=@p
    ) as tblTemp
    Un abbraccio


    • Contrassegnato come risposta brggpr mercoledì 21 maggio 2014 12:54
    • Contrassegno come risposta annullato brggpr venerdì 19 dicembre 2014 15:35
    martedì 20 maggio 2014 08:07
  • Ciao,

    se hai una versione di SQL Server che lo supporta, puoi usare l'operatore UNPIVOT anche. Osserva il seguente esempio:

    USE tempdb;
    GO
    
    
    CREATE TABLE #Date
    (
        id int PRIMARY KEY,
        data1 datetime,
        data2 datetime,
        data3 datetime,
        data4 datetime,
        data5 datetime
    )
    GO
    
    INSERT  INTO #Date VALUES  (1, '20140401', '20140301', '20140501', '20140101', '20140402');
    GO
    
    SELECT  
    	MinData = MIN(colData) 
    FROM    
    	#Date 
    	UNPIVOT (colData FOR nDate IN (data1, data2, data3, data4, data5)) as UNP
    WHERE
    	id = 1;
    
    DROP TABLE #Date;
    GO

    Anche nella soluzione con il CASE la modifica è necessaria ogni volta che aggiungi un campo. Quindi valuterei anche questa strada.

    ciao


    Alessandro Alpi SQL Server MVP

    • Contrassegnato come risposta brggpr mercoledì 21 maggio 2014 12:55
    • Contrassegno come risposta annullato brggpr venerdì 19 dicembre 2014 15:35
    • Proposto come risposta vibi6 lunedì 22 dicembre 2014 09:42
    mercoledì 21 maggio 2014 11:01
    Moderatore
  • il case lo scarterei subito 

    le soluzioni mi sembrano buone tutte e 2 e il 2008 R2 dovrebbe sopportare UNPIVOT 

    grazie a tutti e 2 

    ciao

    mercoledì 21 maggio 2014 12:56
  • Vorrei riaprire questo thread per sapere se è possibile sapere anche il nome o numero della colonna che viene restituita

    grazie a tutti e non uccidetemi

    venerdì 19 dicembre 2014 15:38
  • Vorrei riaprire questo thread per sapere se è possibile sapere anche il nome o numero della colonna che viene restituita

    grazie a tutti e non uccidetemi

    Ma se la soluzione UNPIVOT la scrivi così:

    SELECT TOP 1
    	colData
    	, nDate
    FROM    
    	#Date 
    	UNPIVOT (colData FOR nDate IN (data1, data2, data3, data4, data5)) as UNP
    WHERE
    	id = 1
    ORDER BY
    	colData

    risolvi?


    vibi6

    • Contrassegnato come risposta brggpr lunedì 22 dicembre 2014 09:38
    venerdì 19 dicembre 2014 22:02
  • sembra proprio di si 

    grazie mille

    lunedì 22 dicembre 2014 09:39