GROUP列的一半SELECT

时间:2018-02-13 16:37:31

标签: sql sql-server

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进行分组。

我该如何解决这个问题?

3 个答案:

答案 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'在一个查询中执行此操作。