Ho una tabella cronologia che acquisisce gli aggiornamenti di un determinato oggetto e, oltre ad altre informazioni, acquisisce l'ora in cui si è verificato questo aggiornamento. Quello che mi piacerebbe fare è SELECT
il MIN(LogDate)
corrispondente a una certa colonna ActionTaken
.Selezione di un gruppo di date in SQL Server
Più in particolare, la tabella della cronologia può avere altri (più recente) righe in cui ActionTaken = 1
, ma voglio cogliere la data ActionTaken
divenne 1.
Esempio:
SELECT MIN(LogDate) AS FirstActionDate
FROM HistoryTable
WHERE ID = 123
AND FirstActionTaken = 1
SELECT MIN(LogDate) AS SecondActionDate
FROM HistoryTable
WHERE ID = 123
AND SecondActionTaken = 1
SELECT MIN(LogDate) AS ThirdActionDate
FROM HistoryTable
WHERE ID = 123
AND ThirdActionTaken = 1
Questo funziona bene e ricevo le date corrette senza problemi. Dove sto correndo nei guai viene poi andare a select
il MAX(LogDate)
da questo gruppo:
SELECT MAX(LogDate) AS LastActionDate
FROM HistoryTable
WHERE ID = 123
AND LogDate IN
(
( SELECT MIN(LogDate) AS FirstActionDate
FROM HistoryTable
WHERE ID = 123
AND FirstActionTaken = 1 ),
( SELECT MIN(LogDate) AS SecondActionDate
FROM HistoryTable
WHERE ID = 123
AND SecondActionTaken = 1 ),
( SELECT MIN(LogDate) AS ThirdActionDate
FROM HistoryTable
WHERE ID = 123
AND ThirdActionTaken = 1 )
)
funziona questo anche, ma io odio farlo in questo modo. Potrei salvare le dichiarazioni precedenti in variabili e solo da quelle; sarebbe sicuramente più leggibile, ma quale sarebbe la sintassi JOIN
per questa query?
C'è un modo per combinare le prime tre dichiarazioni SELECT
in una che restituisce tutte e tre le date e non è un pasticcio illeggibile?
Come posso afferrare il più recente LogDate
(come una colonna separata) da questo set di risultati e senza la (apparentemente inutile) ripetendo SELECT
affermazioni?
EDIT:
Qui ci sono alcuni link che ho trovato in relazione alle risposte che sono state date finora:
- Data Normalization
- Using
OUTER/CROSS APPLY
UNPIVOT
(e non solo)
Ho questi ultimi aiuteranno gli altri a cercare soluzioni a problemi simili!
utilizzare UNION e quindi è possibile utilizzare IN – JamieD77