मैं user_activity के पिछले 7 दिनों को वापस करना चाहता था, लेकिन उन खाली दिनों के लिए मैं 0 को मूल्य के रूप में जोड़ना चाहता हूं

कहो मेरे पास यह टेबल है

actions |  id   | date
------------------------
67      |  123  | 2019-07-7
90      |  123  | 2019-07-9
100     |  123  | 2019-07-10
50      |  123  | 2019-07-13
30      |  123  | 2019-07-15

और यह पिछले ७ दिनों के लिए अपेक्षित आउटपुट होना चाहिए

  actions |  id   | date
    ------------------------
    90      |  123  | 2019-07-9
    100     |  123  | 2019-07-10
    0       |  123  | 2019-07-11  <--- padded
    0       |  123  | 2019-07-12  <--- padded
    50      |  123  | 2019-07-13
    0       |  123  | 2019-07-14  <--- padded
    30      |  123  | 2019-07-15

यहाँ मेरी अब तक की क्वेरी है, मुझे केवल पिछले 7 दिन मिल सकते हैं, लेकिन यह सुनिश्चित नहीं है कि डिफ़ॉल्ट मानों में जोड़ना सकारात्मक है या नहीं

SELECT *
FROM user_activity
WHERE action_day > CURRENT_DATE - INTERVAL '7 days' 
ORDER BY uid, action_day
2
XDProgrammer 16 जुलाई 2019, 06:49

1 उत्तर

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

आप generate_series के साथ अपनी तालिका में शामिल होना छोड़ सकते हैं। सबसे पहले आपको अलग-अलग आईडी के लिए पंक्तियों का उपयोग करने का एक तरीका होना चाहिए। फिर उस सेट को मुख्य तालिका के साथ सही ढंग से जोड़ा जा सकता है।

WITH days
AS (SELECT id,dt
    FROM (
        SELECT DISTINCT id FROM user_activity
        ) AS ids
  CROSS JOIN generate_series(
        CURRENT_DATE - interval '7 days', 
    CURRENT_DATE,  interval '1 day') AS dt
    )
SELECT  
     coalesce(u.actions,0)
    ,d.id
    ,d.dt
FROM days d LEFT JOIN user_activity u ON u.id = d.id AND u.action_day = d.dt

डेमो

5
Kaushik Nayak 16 जुलाई 2019, 08:10