使用内部联接查询运行时

问题描述 投票:-1回答:2

我尝试在Sequel Pro中使用内部联接运行查询以使用此方法获取最新的记录/发票:

SELECT tt.Hotel_Property, tt.Preferred_Hotel_Status
FROM hotel_detail tt
INNER JOIN
    (SELECT Hotel_Property, MAX(STR_TO_DATE (`Invoice_Date`, '%m/%d/%Y')) AS MaxDateTime
    FROM hotel_detail
    GROUP BY Hotel_Property) groupedtt 
ON tt.Hotel_Property = groupedtt.Hotel_Property 
AND tt.Invoice_Date = groupedtt.MaxDateTime 

但它正在运行查询很长一段时间,我不确定它是否会实际执行(等待14分钟后取消它)。我知道有很多数据需要解决,但是想知道是否有人有建议让它运行得更快?

*理想情况下,我希望每个酒店物业都有一条记录,给出最近的发票日期和与该最大发票相关的状态

谢谢!

mysql sql query-performance
2个回答
0
投票

据我所知,续集专业版使用MySQL,因此您可能无法使用分析函数,但请尝试以下方法:

SELECT 
Hotel_Property
, Preferred_Hotel_Status
, MAX(STR_TO_DATE (`Invoice_Date`, '%m/%d/%Y')) OVER(PARTITION BY hotel_property) AS MaxDateTime
FROM hotel_detail

如果这不起作用,那么我建议根据日期在“块”中运行查询。因此,可以通过使用WHERE子句一次运行一天。即:

SELECT tt.Hotel_Property, tt.Preferred_Hotel_Status
FROM hotel_detail tt
INNER JOIN
    (SELECT Hotel_Property, MAX(STR_TO_DATE (`Invoice_Date`, '%m/%d/%Y')) AS MaxDateTime
    FROM hotel_detail
WHERE DATE = "the_date_you_want_to_run"
    GROUP BY Hotel_Property) groupedtt 
ON tt.Hotel_Property = groupedtt.Hotel_Property 
AND tt.Invoice_Date = groupedtt.MaxDateTime 
WHERE DATE = "the_date_you_want_to_run"

然后,您可以分别查看不同日期的结果,或者只是将它们插入到新表中,您可以在其中执行更多分析。


0
投票

尝试使用相关子查询:

select hd.*
from hotel_detail hd
where str_to_date(hd.invoice_date, '%m/%d/%Y') =
          (select max(str_to_date(hd2.invoice_date, '%m/%d/%Y'))
           from hotel_detail hd2
           where hd2.hotel_property = hd.hotel_property
          );

这可以利用hotel_detail(hotel_property, invoice_date)的索引。如果使用datedatetime的本机SQL格式正确存储日期,则索引会更有效。

© www.soinside.com 2019 - 2024. All rights reserved.