這是我的sql表
create table #Deneme
(
pk_id INT,
firstname nvarchar(50)。
lastname nvarchar(50)。
process_type smallint。
create_date datetime,
修改日期日期
)
而下面的圖片是記錄。

這是我的sql查詢
select
名。
lastname。
流程_型別
from #Deneme where firstname='John' and lastname='Doe'。
這是查詢結果

這個查詢結果有相同的名字和相同的姓氏。我想這樣過濾這些記錄;如果程序型別大于零,選擇有最近創建日期的記錄,否則選擇程序型別為零的記錄。所以我想得到3條記錄。我怎樣才能做到這一點。是用案例還是用其他方法?
uj5u.com熱心網友回復:
where firstname='John' and lastname='Doe' and
(
process_type=0
或
(process_type>0 and create_date> dateadd(day,-5, getdate()
)
相應地修改dateadd,以指定你認為的 "最近"
uj5u.com熱心網友回復:
如果我沒有理解錯的話,實際上你將得到2行。
Select firstname, lastname, process_type, create_date, modify_date
From #Deneme
Where firstname='John'/span> and lastname='Doe'/span> And
((process_type > 0 And create_date > = ALL (Select create_date From #Deneme Where firstname='John' and lastname='Doe' And process_type > 0)) or
process_type = 0)
uj5u.com熱心網友回復:
Row_number over partition可以幫助你過濾復雜的邏輯。
;with data
as (
select firstname,
姓氏。
process_type,
row_number() over (partition by firstname, lastname order by create_date desc) rid
from #Deneme
where firstname='John' and lastname='Doe')
select *
from data where rid= 1
uj5u.com熱心網友回復:
如果程序型別大于0,選擇有最近創建日期的記錄,否則選擇程序型別為0的記錄。
這聽起來像是一個排序問題,你想選擇一條記錄。 如果是這樣,你可以使用select top (1)和適當的order by子句:
select top (1) d.*
from #deneme d
where firstname = 'John' and lastname = 'Doe'
order by (case when process_type > 0 then 1 else 2 end)。)
create_date desc。
如果你想對所有的名字都這么做,那么你可以使用一個技巧,使用row_number():
select top (1) with ties d.*
from #deneme d
where firstname = 'John' and lastname = 'Doe'
order by row_number() over (partition by firstname, 姓氏
order by (case when process_type > 0 then 1 else 2 end)。)
create_date desc)
);
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/311074.html
標籤:
下一篇:使用父級ID連接行
