回答

收藏

SQL-选择下一个日期查询

技术问答 技术问答 249 人阅读 | 0 人回复 | 2023-09-14

我有一个表,里面有很多ID和与每个ID许多相关的日期,甚至一些没有日期ID。对于每个ID我想选择日期组合ID,日期和也和ID下一个最大关联日期;如果没有,则选择null作为下一个日期。
' E  x. [( L) E1 {6 y- |样品表:
+ `$ |" z% @( ~* K" S4 d7 B$ GID      Date5/1/101                   5/1/10101/102/102                                                                                                                                                                                                                                                                                                                                                                                                          5/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/102                                                                                                    所需输出:
0 \0 R( ~+ y) YID       Date       Next_Date 5/1/10                   5/1/101/101/101010                                                                                                                                                                                                                                            5/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/1/101010101010                                                                                                                                                                                                                                                                    * t6 t4 Y- [1 ^3 X' g( c
    解决方案:                                                               
( E7 T) ~/ p% i& w8 q' I& V                                                                SELECT  ?  E* F4 U' K/ F# C9 q
                                mytable.id,
$ F+ e  j7 P5 x0 |! D/ h                                mytable.date,
( q: ]5 R/ j4 P                                (
/ A0 ]: I3 [8 M( P& ]$ k3 U! @6 U                                                SELECT" A, f0 L8 ]# J  e
                                                                MIN(mytablemin.date)& d8 f( l8 C# f( [
                                                FROM mytable AS mytablemin- f  Y% ~/ G& R! H+ w4 V3 p! I2 R: `
                                                WHERE mytablemin.date > mytable.date
, h! `3 c) u; E( h$ M                                                                AND mytable.id = mytablemin.id$ q5 q, h7 M: }
                                AS NextDate
! @! J" ^. a9 C  i3 _                FROM mytable3 a, q; {% X& `. ~- c4 o% _& q
这已经在SQL Server 2008 R测试(2)DBMS产生以下输出:. t2 y6 C; Y0 Z9 S4 L9 \
id   Date   NextDate----------- ----------------------- ---------------- -------1 2010-05-01 00:00:00.000 2010-06-01 00:00:00.0001 2010-06-01 00:00:00.000 2010-06-15 00:00:00.0001 2010-07-01 00:00:00.000 2010-08-15 00:00:00.0002 2010-06-15 00:00:00.000 2010-07-01 00:00:00.0003 2010-08-15 00:00:00.000 null3 2010-08-15 00:00:00.000 null4 2010-04-01 00:00:00.000 2010-04-15 00:00:00.0004 2010-04-15 00:00:00.000 2010-05-01 00:00:00.0004 NULL NULL更新1:    我对感兴趣的人进行了比较SQL Server 2008 R两个变体的性能(一个变体使用)MIN聚合,另一个变体使用TOP 1和ORDER
! r/ T) D; j) B9 jBY):
8 b3 J5 j6 k0 @日期列没有索引,MIN版本成本为0.0187916,而TOP / ORDER BY版本成本为0.115073,因此MIN版本更好。
; S5 C, ?7 U' r* H& p& m使用date列出的索引表现相同。
! D8 O" J2 f7 O. F& S2 a+ |5 r请注意,这只是用这9个记录进行的测试,所以结果可能是(非常)虚假的…6 u+ D$ c' K7 O
更新2:    结果保留了1万份均匀分布的随机记录。TOP / ORDER% T1 l9 D- U  e" `6 y
BY查询需要很长时间才能运行1万条记录,所以我不得不取消并放弃。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则