У меня есть класс сущности
public class TeklaEventE {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
private Integer projectId;
private Integer drawingId;
private Integer userId;
private String eventType;
private LocalDateTime eventDate;
private LocalDateTime modifiedDate;
private String projectName;
private String userName;
private transient int noOfUser;
// getter setter
}
Я хочу получить *, COUNT(DISTINCT userId)
, группируя projectId
, заказывая eventDate
Я пробовал следующие запросы
SELECT *,COUNT(DISTINCT userId) as noOfUser FROM teklaevent group by projectId order by eventDate desc;
он дает правильный счет, но сначала он запускает group by
затем order by
но мне нужна последняя строка, у которой есть отдельный projectId
. Затем я попробую второй запрос, как было предложено
select * FROM TeklaEvent where id in (select max(id) FROM TeklaEvent group by projectId) order by eventDate desc;
Это дает идеальную строку, в которой я нуждаюсь, потому что eventDate
всегда текущая дата. Но когда я пытаюсь получить COUNT(DISTINCT userId)
из нижнего запроса.
select *,COUNT(DISTINCT userId) as noOfUser FROM TeklaEvent where id in (select max(id) FROM TeklaEvent group by projectId) order by eventDate desc;
он не дает мне правильный результат.
Как это сделать в одном запросе?
Это работает для меня
select a.*, t.noOfUser from teklaevent a inner join ( select max(id) maxid, count(distinct userId) noOfUser from teklaevent group by projectId ) t on a.id = t.maxid;
Вы можете использовать соединение в подзапросе для подсчета
select a.*, t.noOfUser
from teklaevent
inner join (
select projectId , count(distinct userId) noOfUser
from teklaevent
group by projectId
) t a.projectId = t.projectId
select a.*, t.noOfUser from teklaevent a inner join ( select projectId , count(distinct userId) noOfUser from teklaevent group by projectId ) t on a.projectId = t.projectId;
Вернуть все строки
select a.*, t.noOfUser from teklaevent a inner join ( select max(id) maxid, count(distinct userId) noOfUser from teklaevent group by projectId ) t on a.id = t.maxid;
SELECT *
при использованииGROUP BY
. Это не имеет смысла, поэтому подумайте, что вы пытаетесь сделать. Причина:GROUP BY projectId
означает возвращать только одну строку для каждого отдельного значенияprojectId
, но поскольку в таблице может быть много строк с одинаковым значениемprojectId
, какое из многих значений, например, дляdrawingId
должно быть возвращено?