iT邦幫忙

0

sql 語法問題詢問

GJ 2018-09-27 19:47:312220 瀏覽
  • 分享至 

  • xImage

我的TABLE有資料如下
https://ithelp.ithome.com.tw/upload/images/20180927/20014975dRPrWJCICN.jpg

我想最後能顯示如圖下面三筆資料就好,條件是排除NG以及要日期+時間最早的那次
https://ithelp.ithome.com.tw/upload/images/20180927/20014975nDPkGeXPPh.jpg

但我現在碰到的問題是,我做了頁面給user用日期時間去查詢
例如2018/09/20 08:00 ~2018/09/21 18:00 ,這樣的話圖上的第8筆資料會被查詢出來
但實際同樣productno在9/19已經有進了資料庫,user希望就不要算9/20這筆了
能有辦法排除這樣的問題嗎?
或是需要另外的表輔助?或是改原程式比較快?

froce iT邦大師 1 級 ‧ 2018-09-27 20:06:11 檢舉
你該瞭解的是顧客真正要查詢的條件是什麼?為什麼不要9/20這筆。
因為你條件沒錯,那一定是顧客有隱性條件沒告訴你,找不出來永遠有這種例外問題。
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
1
張小馬~
iT邦新手 3 級 ‧ 2018-09-28 10:19:49
最佳解答

以下語法可以幫你帶出該筆資料的所有欄位且不用另做join,我看上面有些解答只有辦法帶出特定欄位(如果還要再帶其他欄位進來就需要另做join)。

原始資料:
https://ithelp.ithome.com.tw/upload/images/20180928/20111566IsYtnKmDgS.png

A層
先把不是NG的選出來
https://ithelp.ithome.com.tw/upload/images/20180928/20111566ynYX4n5w8A.png

B層
tag1:把區間區塊的最小值給列出來
https://ithelp.ithome.com.tw/upload/images/20180928/20111566T7z0Nf7i3W.png

最後
把區間最小值給where出來
https://ithelp.ithome.com.tw/upload/images/20180928/201115664wNfJGvf5n.png

語法如下:

select B.*
--------以下B層--------
from(
select A.*,
MIN("CheckTimes"::numeric) over (PARTITION BY "ProductNo") tag1
--------以下A層--------
from(
SELECT *
FROM "ithelp_case28"
where "CheckStatus" is null --總之是【不是NG】的寫法
) A
--------以上A層--------
) B
--------以上B層--------
where "CheckTimes"::numeric = tag1

::numeric的格式處理就酌情修掉吧~

GJ iT邦好手 1 級 ‧ 2018-10-02 10:53:32 檢舉

謝謝,參考前面DOG大的ROW_NUMBER,加上你的解說已可以求出

1
allenlwh
iT邦高手 1 級 ‧ 2018-09-27 20:05:58
select ProductNo,min(CheckTimes) from tablename
where CheckStatus<>'NG'
group by ProductNo
0
小魚
iT邦大師 1 級 ‧ 2018-09-27 22:56:45
SELECT A.* 
FROM TABLE AS A
INNER JOIN (SELECT ProductNo,min(CheckTimes) AS CheckTimes FROM TABLE WHERE CheckStatus<>'NG' GROUP BY ProductNo) AS B ON A.ProductNo = B.ProductNo AND A.CheckTimes = B.CheckTimes

應該是這樣吧,
沒有資料沒辦法測試。

1
石頭
iT邦高手 1 級 ‧ 2018-09-28 03:19:47

如果只是要求每ProductNo組 最早日期一筆資料的話可以使用 ROW_NUMBER 和 視窗函數

SELECT * FROM (
	 SELECT *,ROW_NUMBER() OVER(PARTITION BY ProductNo ORDER BY RecAt) rn 
	 FROM T
) t1
where rn = 1

我要發表回答

立即登入回答