iT邦幫忙

0

MS-SQL查詢問題

大家好,
想詢問一個SQL查詢的問題
請先看下圖

主要的查詢語句就是一般的Select * from Table where between 開始 and 結束
但是我想判斷資料表裡有出現兩筆資料的日期與MonitorID有相同的話,
就要使用RowFlag = 1的那筆資料,否則就是使用RowFlag = 0的那筆資料
再麻煩各位大神提供解答… 感恩


補充說明
不好意思,我的問法不太好,資料表本身就有RowFlag = 1或 = 0
平常的情況是日期或(Or)MonitorID會重複
(E.x 2021-02-25 17:00有7筆日期都一樣的資料(1~7MonitorID),
2021-02-25 17:01有7筆日期也是一樣的資料(1~7MonitorID),
總共14筆資料,接著每分鐘都還會多7筆日期都一樣,MonitorID是1~7的資料)
在資料表裡只要出現兩筆資料的日期與(And)MonitorID相同,
就要檢查RowFlag欄位,然後採用RowFlag=1的那筆資料,RowFlag=0的就不使用
然後其他的資料假如沒有出現日期與MonitorID相同的狀況,那就是使用RowFlag=0的資料
最後就會Select出日期與MonitorID沒有重複的全部資料

以上面的圖來看, 日期都是 2021-02-25.
是 日期 還是 日期時間 ??
你還是做一份原始資料,跟想達成的結果.
不要只有貼圖,這樣還要幫你打資料.
變成好幾份資料,也不利於討論.
問題釐清,就大概解決一半了.
要是自己都不清,程式自然無從下手.
CooperWu iT邦新手 3 級 ‧ 2021-03-11 17:54:12 檢舉
感謝您的回覆,因為這次比較急,所以問的有點不好,
下次我會先把資料跟結果的SQL語法打好,
問題的敘述我可能還要再多練練,這是我第一次發問,之後會改進
謝謝你願意花時間看我的發問
急 就想要 趕快,然後就是 拉拉雜雜, 來來回回,到頭來,沒比較快.
不如靜下心來,好好整理.
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

0
純真的人
iT邦大師 1 級 ‧ 2021-03-11 16:39:29
最佳解答

你參考看看~

declare @Tmp table(
	Date_Time datetime
	,MonitorID int
	,Value decimal(18,2)
	,S1ID int
	,S2ID int
	,S3ID int
)

insert into @Tmp
values('2021/3/11 13:00:01',2,-1.08,8,2,4)
,('2021/3/11 13:00:01',2,-1.08,8,2,4)
,('2021/3/11 13:00:02',1,-1.08,8,2,4)
,('2021/3/11 13:00:03',2,-1.08,8,2,4)
,('2021/3/11 13:00:04',3,-1.08,8,2,4)

select Date_Time
,MonitorID
,Value
,S1ID
,S2ID
,S3ID
,(case when Sort = 1 then 0 else 1 end) RowFlag
from (
	select *
	,Row_Number()over(partition by Date_Time,MonitorID order by MonitorID) Sort
	from @Tmp
	where Date_Time between '2021/3/11 13:00:01' and '2021/3/11 13:00:04'
) k

https://ithelp.ithome.com.tw/upload/images/20210311/20061369RlMXlCzz7o.png

看更多先前的回應...收起先前的回應...
CooperWu iT邦新手 3 級 ‧ 2021-03-11 17:09:29 檢舉

不好意思,我有緊急做補充說明,麻煩您再看看,謝謝

CooperWu iT邦新手 3 級 ‧ 2021-03-11 17:17:39 檢舉

您的結果是我資料庫原本的樣子,但我是想要01秒的那兩筆資料,只採用RowFlag=1的那筆,不採用RowFlag = 0的那筆,最後會剩4筆資料

那就條件加上~只出現不重複資料就好了吧@@?

select Date_Time
,MonitorID
,Value
,S1ID
,S2ID
,S3ID
,(case when Sort = 1 then 0 else 1 end) RowFlag
from (
	select *
	,Row_Number()over(partition by Date_Time,MonitorID order by MonitorID) Sort
	from @Tmp
	where Date_Time between '2021/3/11 13:00:01' and '2021/3/11 13:00:04'
) k
where (case when Sort = 1 then 0 else 1 end) = 0

如下不重複的判斷

where (case when Sort = 1 then 0 else 1 end) = 0

https://ithelp.ithome.com.tw/upload/images/20210311/20061369YhtysnT8s9.png

CooperWu iT邦新手 3 級 ‧ 2021-03-11 17:44:31 檢舉

再次感謝您願意花時間解答,我將您的解法稍微修改一下就完成了。
不過還是要補充說明一下,資料表本身就有RowFlag欄位,
假如碰到重複資料時,就只能採用RowFlag=1的那筆資料,
其餘的資料正常情況應該是不會重複,所以就是使用RowFlag = 0的資料
所以我將Over的條件改為Orderby RowFlag Desc
這樣就可以用RowFlag = 1的資料為主,RowFlag = 0的為次要。
大概是這樣,非常感謝您

/images/emoticon/emoticon12.gif

0
jumpbow
iT邦新手 4 級 ‧ 2021-03-11 16:31:24

select ( case when Date_time=日期 and MonitorID=ID then 1 else 0 end )as RowFlag,* from Table where between

CooperWu iT邦新手 3 級 ‧ 2021-03-11 16:46:19 檢舉

不好意思,我問的不太好,應該要說是整個資料表,不是某筆資料。
假如出現一樣的兩筆資料,就要使用RowFlag=1的那筆資料,然後RowFlag = 0的同一筆資料就不使用

建議你還是重新整理一下思路,然後好好舉例.

CooperWu iT邦新手 3 級 ‧ 2021-03-11 17:10:21 檢舉

您好,我做了補充說明,再麻煩您有空時看看

我要發表回答

立即登入回答