मेरे पास एक टेबल है जिसमें डेट कॉलम है, दूसरे कॉलम में खुशी की कुछ आत्म-रिपोर्ट है, और एक फ्लैग कॉलम है जो जिम के दिन को इंगित करता है।

मैं जिम सत्र के एक दिन पहले, उसके दिन और अगले दिन औसत खुशी स्कोर प्राप्त करना चाहता हूं।

यदि आप इस तालिका की कल्पना करते हैं, तो औसत दिन_पहले = 1, दिन_ऑफ़ = 2, और दिन_बाद = 3 लौटना चाहिए।

enter image description here

तो सेट अप this fiddle जैसा है, हालांकि मेरे वास्तविक डेटाबेस में जिम फ्लैग कॉलम एक अलग टेबल से जुड़ा हुआ है।

CREATE TABLE test
    (`date` datetime, `gym` int, `happiness` int)
;

INSERT INTO test
    (`date`, `gym`, `happiness`)
VALUES
    ('2019-01-06 00:00:00', NULL, 1),
    ('2019-02-06 00:00:00', 1, 2),
    ('2019-03-06 00:00:00', NULL, 3),
    ('2019-04-06 01:00:00', NULL, 1),
    ('2019-05-06 01:00:00', 1, 2),
    ('2019-06-06 01:00:00', NULL, 3),
    ('2019-07-06 01:00:00', NULL, 1),
    ('2019-08-06 01:00:00', 1, 2),
    ('2019-09-06 01:00:00', NULL, 3)
;

मैंने "जिम" कॉलम में दिनांक - 1 = 1 पर लौटने के लिए एक सबक्वायरी का उपयोग करने का प्रयास किया, और ऐसे मामले में परिणामों का भी उपयोग किया जिसमें "दिन", "दिन पहले", और "दिन के बाद" तार होंगे। तब मैं बस उस कॉलम के आधार पर समूह बना सकता था। मैं इसे काम पर नहीं ला सका और मुझे यकीन भी नहीं है कि आप ऐसा कुछ कर सकते हैं।

0
user43107 2 जुलाई 2019, 22:34

1 उत्तर

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

दो स्वयं-जुड़ने का प्रयोग करें।

SELECT AVG(before.happiness) AS day_before, AVG(current.happiness) AS day_of, AVG(after.happiness) AS day_after
FROM test AS current
JOIN test AS before ON before.date = DATE_SUB(current.date, INTERVAL 1 DAY)
JOIN test AS after ON after.date  = DATE_ADD(current.date, INTERVAL 1 DAY)
WHERE current.gym = 1
1
Barmar 2 जुलाई 2019, 19:45