使用内部联接查询运行时

时间:2018-03-06 14:34:25

标签: mysql sql query-performance

我尝试在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分钟后取消它)。我知道有很多数据需要解决,但是想知道是否有人有建议让它运行得更快?

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

谢谢!

2 个答案:

答案 0 :(得分: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"

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

答案 1 :(得分:0)

尝试使用相关子查询:

hotel_detail(hotel_property, invoice_date)

这可以利用date上的索引。如果使用datetimegit branch -a的本机SQL格式正确存储日期,索引将更有效。