問題描述:pricesdaily表存有每天的**資料,基本上是每天一條(除去週末兩天和法定節假日沒有)。
現在問題是其中(以asxcode和date來判斷)某天的資料丟失,有啥方法找到丟失這天的資料(返回丟失的asxcode和date)。
pricesdaily原表資料如下:
asxcode,date,price
-------------------------------------
aaa 1999-01-04 00:00:00 2.5000
aaa 1999-01-05 00:00:00 2.4200
aaa 1999-01-06 00:00:00 2.4500
aaa 1999-01-07 00:00:00 2.5100
aaa 1999-01-08 00:00:00 2.5700
aaa 1999-01-11 00:00:00 2.6200
aaa 1999-01-12 00:00:00 2.7400
aaa 1999-01-13 00:00:00 2.6300
aaa 1999-01-14 00:00:00 2.6400
aaa 1999-01-15 00:00:00 2.7200
aaa 1999-01-19 00:00:00 2.6400
aab 2004-09-24 00:00:00 .8400
aab 2004-09-27 00:00:00 .8400
aab 2004-09-28 00:00:00 .8300
aab 2004-09-29 00:00:00 .8400
aab 2004-09-30 00:00:00 .8300
aab 2004-10-01 00:00:00 .8300
aab 2004-10-04 00:00:00 .8000
aab 2004-10-05 00:00:00 .8300
aab 2004-10-07 00:00:00 .8300
aab 2004-10-08 00:00:00 .7900
-------
上面原表中,有啥方法可以查出丟失了兩條(週末兩天和法定節假日除外):
asxcode = 'aaa',date = '1999-01-18' 和 asxcode = 'aab',date = '2004-10-06';
只要返回丟失的asxcode和date。
使用cte解決方法:
usetest
declare
@1table
(asxcode
char(3
),date
datetime
,price
money
)insert
into
@1select
'aaa',
'1999-01-04 00:00:00',
2.5000
union
allselect
'aaa',
'1999-01-05 00:00:00',
2.4200
union
allselect
'aaa',
'1999-01-06 00:00:00',
2.4500
union
allselect
'aaa',
'1999-01-07 00:00:00',
2.5100
union
allselect
'aaa',
'1999-01-08 00:00:00',
2.5700
union
allselect
'aaa',
'1999-01-11 00:00:00',
2.6200
union
allselect
'aaa',
'1999-01-12 00:00:00',
2.7400
union
allselect
'aaa',
'1999-01-13 00:00:00',
2.6300
union
allselect
'aaa',
'1999-01-14 00:00:00',
2.6400
union
allselect
'aaa',
'1999-01-15 00:00:00',
2.7200
union
allselect
'aaa',
'1999-01-19 00:00:00',
2.6400
union
allselect
'aab',
'2004-09-24 00:00:00
', .
8400
union
allselect
'aab',
'2004-09-27 00:00:00
', .
8400
union
allselect
'aab',
'2004-09-28 00:00:00
', .
8300
union
allselect
'aab',
'2004-09-29 00:00:00
', .
8400
union
allselect
'aab',
'2004-09-30 00:00:00
', .
8300
union
allselect
'aab',
'2004-10-01 00:00:00
', .
8300
union
allselect
'aab',
'2004-10-04 00:00:00
', .
8000
union
allselect
'aab',
'2004-10-05 00:00:00
', .
8300
union
allselect
'aab',
'2004-10-07 00:00:00
', .
8300
union
allselect
'aab',
'2004-10-08 00:00:00
', .
7900
;with
t1as
(select
asxcode,startdate
=min
(date),enddate
=max
(date)
from
@1group
byasxcode
) ,t2as(
select
asxcode,date
=startdate
from
t1union
allselect
a.asxcode,date
=a.date+1
from
t2 a,t1 b
where
a.asxcode
=b.asxcode
anda.date
<
b.enddate
)selecta.*
from
t2 a
left
outer
join
@1b
onb.asxcode
=a.asxcode
anda.date
=b.date
where
b.date
isnull
anddatename
(dw,a.date)
notin('
星期六','
星期日'
)option
(maxrecursion 0)
--其他假日條件可以自由加入
/*(21 行受影響)
asxcode date
------- -----------------------
aab 2004-10-06 00:00:00.000
aaa 1999-01-18 00:00:00.000
(2 行受影響)
*/cte預設可以遞迴100層,所以使用option(maxrecursion 0)引數,
cte目前最大可以32767層,從我們現實考慮(select 32767/365.0=89.772602)可以查詢89年的資料,已經夠用了呵呵。
使用CTE來實現一條查詢丟失的資料行問題
問題描述 pricesdaily表存有每天的 資料,基本上是每天一條 除去週末兩天和法定節假日沒有 現在問題是其中 以asxcode和date來判斷 某天的資料丟失,有啥方法找到丟失這天的資料 返回丟失的asxcode和date pricesdaily原表資料如下 asxcode,date,pric...
查詢資料的上一條和下一條
查詢當前資料的下一條 select from 表 where id 當前資料的id order by id asc limit1 查詢當前資料的上一條 select from 表 where id 當前資料的id order by id asc limit 1 查詢當前資料的下一條 select f...
使用lead lag 查詢上一條記錄 下一條記錄
表的結構如下 staff no staff name 001 張三 男 002 李四 男 003 王五 男 如要查詢staffno是002的前一條記錄 select from staff where staff no select c.p from select staff no,lag staff...