簡體   English   中英

避免在我的 SQL 查詢中使用 CROSS JOIN(太重)

[英]Avoid using CROSS JOIN on my SQL query (too heavy)

我正在處理 SQL 查詢以定義客戶類型,目標是區分老活躍客戶和流失客戶(流失 = 在特定時間范圍內停止使用貴公司產品或服務的客戶)

為了做到這一點,我想出了這個完美的查詢:

WITH customers AS (
  SELECT 
    DATE(ord.delivery_date) AS date,
    ord.customer_id 
  FROM table_template AS ord
  WHERE cancel_date IS NULL 
    AND order_type_id IN (1,3) 
  GROUP BY DATE(ord.delivery_date), ord.customer_id, ord.delivery_date),

days AS (SELECT DISTINCT date FROM customers),

recap AS (
    SELECT * FROM (
        SELECT  
            a1.date,
            a2.customer_id,
            MAX(a2.date) AS last_order,
            DATE_DIFF(a1.date, MAX(a2.date), day) AS days_since_last,
            MIN(a2.date) AS first_order,
            DATE_DIFF(a1.date, MIN(a2.date), day) AS days_since_first
        FROM days AS a1
        CROSS JOIN customers AS a2 WHERE a2.date <= a1.date
        GROUP BY a1.date, customer_id)
  )

SELECT * FROM recap 

查詢結果: 在此處輸入圖像描述

這個查詢的唯一問題是計算量太大(它使用了大量的 CPU 秒數)我認為這是由於 CROSS JOIN。

我需要你們的一些幫助才能找到另一種方法來獲得相同的結果,一種不需要交叉連接就可以得到相同 output 的方法,你們認為這可能嗎?

正如您所提到的查詢加載時間過長的問題是因為 inte.net 問題。 此外,我將嘗試通過以下示例查詢進一步解釋 Inner Join:

SELECT distinct a1.id,a1.date    
FROM `table1` AS a1
INNER JOIN `table2` AS a2
ON a2.date <= a1.date

只要條件滿足,INNER JOIN 就會從兩個表中選擇所有行。 在此示例查詢中,僅當表 1 中的日期值大於或等於表 2 中的日期值時,它才會根據條件a2.date <= a1.date給出結果。

輸入表 1:

在此處輸入圖像描述

輸入表 2:

在此處輸入圖像描述

Output表:

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM