2014-02-13 42 views
4

我有一個看起來像一些樣本數據:(編輯:我沒有SQL Server 2012中)仿效SQL Server和LINQ 2012滯後窗口功能

create table #base 
(pat_id int 
,admission_date date 
,discharge_date date 
) 
go 
insert into #base 
values 
(1, '2007-01-04', '2007-01-04'), 
(1, '2007-01-10', '2007-01-10'), 
(1, '2007-01-11', '2007-01-11'), 
(1, '2007-01-18', '2007-01-18'), 
(1, '2007-01-24', '2007-01-24'), 
(1, '2008-01-25', '2008-01-26'), 
(2, '2007-02-01', '2007-02-01'), 
(2, '2007-02-06', '2007-02-06'), 
(2, '2007-02-07', '2007-02-07'), 
(2, '2007-02-08', '2007-02-08') 

這裏的SQL查詢我想效仿與LINQ

;with cte 
as 
(
    select pat_id 
      ,admission_date 
      ,discharge_date 
      ,ROW_NUMBER() over(partition by pat_id order by admission_date asc) as rn 
    from #base 
) 
select firstCte.pat_id 
     ,firstCte.discharge_date as firstAdmitReference 
     ,secondCte.admission_date as dischargeReference 
     ,case when DATEDIFF(DAY,firstCte.discharge_date,secondCte.admission_date) <= 30 then 1 else 0 end Readmit 
from cte as firstCte 
inner join cte as secondCte 
     on firstCte.pat_id = secondCte.pat_id 
where firstCte.rn = secondCte.rn -1 

下面是查詢的結果是什麼樣子:

create table #readmit_data 
(pat_id int 
,admission_date date 
,discharge_date date 
,within_x_days int 
) 
insert into #readmit_data(pat_id,admission_date,discharge_date,within_x_days) 
values 

(1, '2007-01-04', '2007-01-10', 1), 
(1, '2007-01-10', '2007-01-11', 1), 
(1, '2007-01-11', '2007-01-18', 1), 
(1, '2007-01-18', '2007-01-24', 1), 
(1, '2007-01-24', '2008-01-25', 0), 
(2, '2007-02-01', '2007-02-06', 1), 
(2, '2007-02-06', '2007-02-07', 1), 
(2, '2007-02-07', '2007-02-08', 1) 

在這個結果集中日的基本格式È數據是

patient ID dischargeDate nextVisitAdmitDate 

A 1在within_x_days列表示患者有重新接納與他們的最後放電30天。理想情況下,30將是用戶輸入的變量。

LINQ中有什麼樣的構造可用於做到這一點?

+0

你想在LINQ to SQL查詢中使用#Temp表嗎?它不能做到。 – thepirat000

+0

是*#base *和*#temp *代碼中的同一個表嗎? – thepirat000

+0

@ thepirat000 #base和#temp是一樣的。我實際上並不想查詢臨時表,我希望其他人能夠快速查看問題,所以我添加了SQL腳本。 – wootscootinboogie

回答

3

LinqToSql沒有類似於lag/lead/row_number的函數。

你根本無法做到這一點,最簡單的方法是將SQL發送到機器上,然後在返回時將結果集映射到對象。