SELECT
mytable.id,
mytable.date,
(
SELECT
MIN(mytablemin.date)
FROM mytable AS mytablemin
WHERE mytablemin.date > mytable.date
AND mytable.id = mytablemin.id
) AS NextDate
FROM mytable
Questo è stato testato su SQL Server 2008 R2 (ma dovrebbe funzionare su altri DBMS) e produce il seguente output:
id date NextDate
----------- ----------------------- -----------------------
1 2010-05-01 00:00:00.000 2010-06-01 00:00:00.000
1 2010-06-01 00:00:00.000 2010-06-15 00:00:00.000
1 2010-07-01 00:00:00.000 2010-08-15 00:00:00.000
2 2010-06-15 00:00:00.000 2010-07-01 00:00:00.000
3 2010-08-15 00:00:00.000 NULL
3 2010-08-15 00:00:00.000 NULL
4 2010-04-01 00:00:00.000 2010-04-15 00:00:00.000
4 2010-04-15 00:00:00.000 2010-05-01 00:00:00.000
4 NULL NULL
Update 1: Per coloro che sono interessato, ho confrontato le prestazioni delle due varianti in SQL Server 2008 R2 (uno utilizza l'aggregazione MIN e l'altro utilizza TOP 1 con un ORDER BY):
Senza un indice nella colonna della data, la versione MIN aveva un costo di 0,0187916 e la versione TOP/ORDER BY aveva un costo di 0,115073 quindi la versione MIN era "migliore".
Con un indice sulla colonna della data, si sono comportati in modo identico.
Si noti che questo stava testando con solo questi 9 record in modo che i risultati potrebbero essere (molto) spuria ...
Aggiornamento 2: I risultati valgono per 10.000 record casuali uniformemente distribuiti. La query TOP/ORDER BY impiega così tanto tempo per essere eseguita a 100.000 record e ho dovuto annullarla e rinunciare.
fonte
2010-08-31 14:03:10
il tuo database – Bharat