मेरे पास create_at फ़ील्ड (ईमेल द्वारा समूहीकरण) पर MIN और MAX करके ग्राहकों की पहली ऑर्डर तिथि और अंतिम ऑर्डर तिथि है, लेकिन मुझे ग्राहकों को दूसरी सबसे हालिया ऑर्डर तिथि (आदेश दिनांक अंतिम ऑर्डरडेट से ठीक पहले) प्राप्त करने की भी आवश्यकता है।

SELECT 
    customer_email, 
    COUNT(entity_id) AS NumberOfOrders, 
    MIN(CONVERT_TZ(created_at,'UTC','US/Mountain')) AS 'FirstOrder', 
    MAX(CONVERT_TZ(created_at,'UTC','US/Mountain')) AS 'MostRecentOrder',
    SUM(grand_total) AS TotalRevenue, 
    SUM(discount_amount) AS TotalDiscount
FROM sales_flat_order 
WHERE 
    customer_email IS NOT NULL
    AND store_id = 1
GROUP BY customer_email
LIMIT 500000
1
Christopher V 18 सितंबर 2019, 22:40

1 उत्तर

सबसे बढ़िया उत्तर

विंडो फ़ंक्शन ROW_NUMBER() का उपयोग करें (MySQL 8.0 में उपलब्ध):

SELECT *
FROM (
    SELECT 
        t.*, 
        ROW_NUMBER() OVER(PARTITION BY customer_email ORDER BY created_at) rn_asc,
        ROW_NUMBER() OVER(PARTITION BY customer_email ORDER BY created_at DESC) rn_desc
    FROM sales_flat_order
    WHERE customer_email IS NOT NULL AND store_id = 1
) x
WHERE rn_asc = 1 OR rn_desc <= 2

यह आपको प्रत्येक ग्राहक द्वारा दिए गए पहले और दो नवीनतम ऑर्डर प्राप्त करेगा।

नोट: यह स्पष्ट नहीं है कि समयक्षेत्र रूपांतरण किस लिए अभिप्रेत हैं। मैंने उन्हें अलग छोड़ दिया, क्योंकि वे स्पष्ट रूप से छँटाई क्रम को प्रभावित नहीं करते हैं; अपने उपयोग के मामले में उन्हें जोड़ने के लिए स्वतंत्र महसूस करें।


यदि आप प्रति ग्राहक एक ही रिकॉर्ड चाहते हैं, साथ ही उसके ऑर्डर की कुल संख्या, और उसके पहले, अंतिम, और अंतिम लेकिन एक ऑर्डर की तारीख के साथ, तो आप बाहरी क्वेरी में एकत्र कर सकते हैं:

SELECT 
    customer_email,
    NumberOfOrders,
    MAX(CASE WHEN rn_asc = 1 THEN created_at END) FirstOrder,
    MAX(CASE WHEN rn_desc = 1 THEN created_at END) MostRecentOrder,
    MAX(CASE WHEN rn_desc = 2 THEN created_at END) MostRecentButOneOrder,
    TotalRevenue,
    TotalDiscount
FROM (
    SELECT 
        customer_email,
        created_at,
        COUNT(*) OVER(PARTITION BY customer_email) NumberOfOrders,
        SUM(grand_total) OVER(PARTITION BY customer_email) TotalRevenue, 
        SUM(discount_amount) OVER(PARTITION BY customer_email) TotalDiscount,
        ROW_NUMBER() OVER(PARTITION BY customer_email ORDER BY created_at) rn_asc,
        ROW_NUMBER() OVER(PARTITION BY customer_email ORDER BY created_at DESC) rn_desc
    FROM sales_flat_order
    WHERE customer_email IS NOT NULL AND store_id = 1
) x
GROUP BY customer_email
0
GMB 18 सितंबर 2019, 19:55