使用CTE來實現一條查詢丟失的資料行問題

2022-01-30 09:27:33 字數 4449 閱讀 9209

問題描述: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...