2017-05-18 81 views
1

我有以下結構。不是在一張桌子上,而是爲了保持簡單:在JPQL中選擇具有group by和max的行

Press  | Batch  | Start time 
------------------------------------------------- 
PRESS_1  | 2051   | 2017-05-18T00:00:00 
PRESS_1  | 2052   | 2017-05-19T00:00:00 
PRESS_2  | 2053   | 2017-05-20T00:00:00 
PRESS_2  | 2054   | 2017-05-16T00:00:00 
PRESS_3  | 2055   | 2017-05-12T00:00:00 
PRESS_3  | 2056   | 2017-05-18T00:00:00 
PRESS_3  | 2057   | 2017-05-19T00:00:00 

我想獲得每個印刷機的最後計劃批次。結果應該是:

Press  | Batch  | Start time 
------------------------------------------------- 
PRESS_1  | 2052   | 2017-05-19T00:00:00 
PRESS_2  | 2053   | 2017-05-20T00:00:00 
PRESS_3  | 2057   | 2017-05-19T00:00:00 

但是,當我通過按分組,並且還想選擇批處理。我有義務將該批次放入「分組依據」條款中。

Select x.Press, x.Batch, max(x.StartTime) 
From myTable x 
Group by x.Press 

這怎麼能通過JPQL來實現?

+0

@ Veljko89,您可以看到PRESS_2,但情況並非總是如此。 – Hazaart

+0

這個問題已經在這裏回答了無數次。請在發佈問題前嘗試做一些調查。 –

+0

@GiorgosBetsos很難找到合適的詞來谷歌這一點。但是請保持文章開放,因爲這認爲JPQL比您引用的重複帖子更有限。這種特殊情況也不是同一個原理。 – Hazaart

回答

0

你應該能夠只得到批次以及假設你每批次的增加開始時間最大:

Select x.Press, max(x.Batch), max(x.StartTime) 
From x 
Group by x.Press 
+0

這不起作用。對於新聞2,它將返回:PRESS_2,2054,2017-05-20。所以批次不正確。 – Hazaart

2

你可以使用與彙總結果的內部連接的分組

select * from my_table as t1 
inner join (
select Press, max(start_time) my_time 
from my_table 
group by Press) t2 on t1.Press = T2.Press and t2.my_time = t1.start_time 

或避免加入

select * from my_table as t1 
where (t1.Press, t1.start_time) in (
select Press, max(start_time) 
from my_table 
group by Press) 

或者如果你ORM是有限的,你可以創造EA適當的視圖,然後使用視圖名稱爲表避免子查詢

+0

不幸的是,在JPQL – Hazaart

+0

中不允許使用連接類中的子查詢是否允許使用元組。無論如何回答更新與元組 – scaisEdge

+0

顯然也沒有斑點:(這是非常有限,因爲它不是原生的 – Hazaart

2

,你要選擇每按一次的最大START_TIME項,您使用的東西如下面所提及 -

Select x.Press, x.Batch, x.StartTime 
From x 
where (press,starttime) in 
(select press, max(starttime) 
from x group by press) 

讓我們給試試吧,請讓我知道。