aut*_*tic 7 sql t-sql sql-server sql-server-2005
在SQL Server 2005中,我有一个表格,其数据如下所示:
WTN------------Date
555-111-1212 2009-01-01
555-111-1212 2009-01-02
555-111-1212 2009-01-03
555-111-1212 2009-01-15
555-111-1212 2009-01-16
212-999-5555 2009-01-01
212-999-5555 2009-01-10
212-999-5555 2009-01-11
Run Code Online (Sandbox Code Playgroud)
从这个我想提取WTN,Min(日期),Max(日期)扭曲是我想在日期中有间隙时也要打破,所以从上面的数据来看,我的结果应该是这样的:
WTN------------ MinDate---- MaxDate
555-111-1212 2009-01-01 2009-01-03
555-111-1212 2009-01-15 2009-01-16
212-999-5555 2009-01-01 2009-01-01
212-999-5555 2009-01-10 2009-01-11
Run Code Online (Sandbox Code Playgroud)
为什么每个人都这么死,不能使用桌子来做这种事情?数字表或日历表占用这么小的空间,如果足够引用,可能在内存中.您还可以使用ROW_NUMBER()轻松地导出数字表.使用数字表可以帮助理解查询.但是这里有一个不那么直截了当的例子,一段时间我从Plamen Ratchev那里捡到的一招,希望它有所帮助.
DECLARE @wtns TABLE
(
WTN CHAR(12),
[Date] SMALLDATETIME
);
INSERT @wtns(WTN, [Date])
SELECT '555-111-1212','2009-01-01'
UNION ALL SELECT '555-111-1212','2009-01-02'
UNION ALL SELECT '555-111-1212','2009-01-03'
UNION ALL SELECT '555-111-1212','2009-01-15'
UNION ALL SELECT '555-111-1212','2009-01-16'
UNION ALL SELECT '212-999-5555','2009-01-01'
UNION ALL SELECT '212-999-5555','2009-01-10'
UNION ALL SELECT '212-999-5555','2009-01-11';
WITH x AS
(
SELECT
[Date],
wtn,
part = DATEDIFF(DAY, 0, [Date])
+ DENSE_RANK() OVER
(
PARTITION BY wtn
ORDER BY [Date] DESC
)
FROM @wtns
)
SELECT
WTN,
MinDate = MIN([Date]),
MaxDate = MAX([Date])
FROM
x
GROUP BY
part,
WTN
ORDER BY
WTN DESC,
MaxDate;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
759 次 |
| 最近记录: |