在SQL查詢中,查詢分組最大最小值可以使用Group By,但是需要同時獲得最大值/最小值發生時間的情況下,Group By並不適用,此時可使用本文介紹的方法。
假設“測值表”結構和內容如圖所示,需要查詢每一個測點測值的最大值/最小值及發生時間。
使用Group By可以查詢得到每個測點的最大值/最小值,但是需要同時查詢發生時間時,會出現錯誤:“選擇列表中的列 "測值表.時間" 無效,因為該列沒有包含在聚合函式或 GROUP BY 子句中。”
針對這一需求,有兩種巢狀查詢方法,一種是在巢狀查詢中使用笛卡爾積,一種是在巢狀查詢中使用連線查詢。
解決方法:
求最大值,注意圖中紅線標出的語句
select 測點編號,
測值 as 最大值,
時間
from 測值表
where ID not in
(select a.ID from 測值表 a,測值表 b
where a.測值
(select a.ID from 測值表 a
inner join 測值表 b on a.測點編號=b.測點編號
求最小值,注意圖中紅線標出的語句
測值 as 最小值,
where a.測值>b.測值 and a.測點編號=b.測點編號);
where a.測值>b.測值);
在SQL查詢中,查詢分組最大最小值可以使用Group By,但是需要同時獲得最大值/最小值發生時間的情況下,Group By並不適用,此時可使用本文介紹的方法。
假設“測值表”結構和內容如圖所示,需要查詢每一個測點測值的最大值/最小值及發生時間。
使用Group By可以查詢得到每個測點的最大值/最小值,但是需要同時查詢發生時間時,會出現錯誤:“選擇列表中的列 "測值表.時間" 無效,因為該列沒有包含在聚合函式或 GROUP BY 子句中。”
針對這一需求,有兩種巢狀查詢方法,一種是在巢狀查詢中使用笛卡爾積,一種是在巢狀查詢中使用連線查詢。
解決方法:
求最大值,注意圖中紅線標出的語句
select 測點編號,
測值 as 最大值,
時間
from 測值表
where ID not in
(select a.ID from 測值表 a,測值表 b
where a.測值
select 測點編號,
測值 as 最大值,
時間
from 測值表
where ID not in
(select a.ID from 測值表 a
inner join 測值表 b on a.測點編號=b.測點編號
where a.測值
求最小值,注意圖中紅線標出的語句
select 測點編號,
測值 as 最小值,
時間
from 測值表
where ID not in
(select a.ID from 測值表 a,測值表 b
where a.測值>b.測值 and a.測點編號=b.測點編號);
select 測點編號,
測值 as 最小值,
時間
from 測值表
where ID not in
(select a.ID from 測值表 a
inner join 測值表 b on a.測點編號=b.測點編號
where a.測值>b.測值);