SELECT Property.PropertyID, Property.Name, BTAT.Action as Status, BTAT.Total, BTAT.BookingID, DateTimeCreatedRealtime
FROM BookingTotalAuditTrail as BTAT
LEFT JOIN Booking ON Booking.BookingID=BTAT.BookingID
LEFT JOIN PropertyBooking ON BTAT.BookingID=PropertyBooking.BookingID
LEFT JOIN Property ON PropertyBooking.PropertyID=Property.PropertyID
WHERE (PropertyBooking.PropertyID IN(25)) AND (DateTimeCreatedRealTime BETWEEN CAST('2018-02-13 00:00:00' as datetime) AND CAST('2018-02-14 23:59:59' as datetime))
ORDER BY DateTimeCreatedRealtime DESC
返回
PropertyID Name Status Total BookingID DateTimeCreatedRealTime
25 Beach Resort & Villas Modified 543 747890 2018-02-13 09:56:40
25 Beach Resort & Villas Modified 499 747890 2018-02-13 09:56:21
25 Beach Resort & Villas Modified 499 747890 2018-02-13 09:56:19
25 Beach Resort & Villas New 277 747890 2018-02-13 09:56:09
但我想按BookingID和Status对行进行分组,并使用max(DateTimeCreatedRealTime)来抓取最旧的行。所以上面变成了
PropertyID Name Status Total BookingID DateTimeCreatedRealTime
25 Beach Resort & Villas Modified 543 747890 2018-02-13 09:56:40
25 Beach Resort & Villas New 277 747890 2018-02-13 09:56:09
我在应用SELECT max(DateTimeCreatedRealTime)
和
GROUP BY Property.PropertyID, Property.Name, BTAT.Action, BTAT.BookingID
列'BookingTotalAuditTrail.Total'无效 选择列表,因为它不包含在聚合中 函数或GROUP BY子句。
问题在于我不想按总计,持续时间和DateTimeCreatedRealTime进行分组。
我该如何解决这个问题?
答案 0 :(得分:0)
我建议使用窗口函数:
with t as (
< your query here >
)
select t.*
from (select t.*, row_number() over (partition by bookingid, status order by DateTimeCreatedRealTime) as seqnum
from t
) t
where seqnum = 1;
答案 1 :(得分:0)
如果按某些列分组,其他列需要包含在聚合函数中 - 因为在分组后它们可能每行有多个值...
因此,您必须在不在分组中的所有列上使用MAX()或MIN()或FIRST()或SUM()或其他内容,具体取决于您希望为该组查看的值... < / p>
如果特定的ProperyId,Name,Action和BookID组合有两行或更多行 - 您要将哪个值用于Total Duration和DateTimeCreatedRealTime,因为它们会有多个?如果你希望它们都相同 - 你可以使用FIRST()来获得第一个值。
答案 2 :(得分:0)
您需要执行单独的查询或内部查询以查找最新行的ID,然后选择其字段。
如果你正在使用Postgresql,你可以考虑使用'DISTINCT ON'在一个查询中执行此操作。