समय में तालिका का वितरण

मेरे पास प्रति उपयोगकर्ता लगभग 3000 पंक्तियों के साथ एक MySQL तालिका है। कॉलम में से एक डेटाटाइम फ़ील्ड है, जो उत्परिवर्तनीय है, इसलिए पंक्तियां क्रमिक क्रम में नहीं हैं।

मैं चार्ट में समय वितरण को विज़ुअलाइज़ करना चाहता हूं, इसलिए मुझे कई अलग-अलग डेटापॉइंट्स चाहिए। 20 डेटापॉइंट पर्याप्त होंगे।

मैं यह कर सकता था:

select timefield from entries where uid = ? order by timefield;

और हर 150 वीं पंक्ति को देखो।

या मैं 20 अलग-अलग प्रश्न कर सकता हूं और सीमा 1 और ऑफ़सेट का उपयोग कर सकता हूं।

लेकिन एक और अधिक कुशल समाधान होना चाहिए ...

0
जोड़ा संपादित
विचारों: 1
क्या आप सवाल का थोड़ा और वर्णन कर सकते हैं? आप जिस आउटपुट की तलाश में हैं वह क्या है? क्या आप आवृत्ति चार्ट देखना चाहते हैं (उदाहरण: जनवरी = 132, फरवरी = 112, मार्च = 173, आदि में प्रविष्टियों की संख्या), या आप सबसे पुरानी प्रविष्टि के व्यक्तिगत मूल्य, 150 वीं सबसे पुरानी प्रविष्टि, 300 वें, आदि?
जोड़ा लेखक nickf, स्रोत

7 उत्तर

मेरे संदर्भ के लिए - और पोस्टग्रेज़ का उपयोग करने वालों के लिए - पोस्टग्रेस 9.4 ने सेट एग्रीगेट्स को आदेश दिया होगा जो इस समस्या को हल करना चाहिए:

SELECT percentile_disc(0.95) 
WITHIN GROUP (ORDER BY response_time) 
FROM pageviews;

Source: http://www.craigkerstiens.com/2014/02/02/Examining-PostgreSQL-9.4/

0
जोड़ा

@Michal

किसी भी कारण से, आपका उदाहरण केवल तभी काम करता है जब @recnum ऑपरेटर से कम का उपयोग करता है। मुझे लगता है कि जब एक पंक्ति को फ़िल्टर किया जाता है, तो राउनम वृद्धि नहीं होती है, और यह किसी और से मेल नहीं खाती है।

यदि मूल तालिका में एक ऑटो वृद्धि हुई आईडी कॉलम है, और पंक्तियों को क्रमिक क्रम में डाला गया था, तो यह कार्य करना चाहिए:

select timefield from entries
where uid = ? and id % 150 = 0 order by timefield;

बेशक यह काम नहीं करता है अगर आईडी और टाइमफील्ड के बीच कोई सहसंबंध नहीं है, जब तक कि आप वास्तव में समान रूप से दूरी वाले समय क्षेत्र प्राप्त करने की परवाह नहीं करते हैं, केवल 20 यादृच्छिक हैं।

0
जोड़ा

ऐसा कुछ मेरे दिमाग में आया

select @rownum:[email protected]+1 rownum, entries.* 
from (select @rownum:=0) r, entries 
where uid = ? and rownum % 150 = 0

मेरे पास MySQL नहीं है लेकिन शायद यह मदद करेगा ...

0
जोड़ा

जहां तक ​​विज़ुअलाइज़ेशन, मुझे पता है कि यह आवधिक नमूना नहीं है जिसके बारे में आप बात कर रहे हैं, लेकिन मैं उपयोगकर्ता के लिए सभी पंक्तियों को देखता हूं और बाल्टी के भीतर एक अंतराल बाल्टी, एसयूएम चुनता हूं और बार ग्राफ या इसी तरह दिखाता हूं। यह एक वास्तविक "वितरण" दिखाएगा, क्योंकि समय सीमा के भीतर कई घटनाएं महत्वपूर्ण हो सकती हैं।

SELECT DATEADD(day, DATEDIFF(day, 0, timefield), 0) AS bucket -- choose an appropriate granularity (days used here)
     ,COUNT(*)
FROM entries
WHERE uid = ?
GROUP BY DATEADD(day, DATEDIFF(day, 0, timefield), 0)
ORDER BY DATEADD(day, DATEDIFF(day, 0, timefield), 0)

या यदि आपको अपने आप को दोहराने के तरीके को पसंद नहीं है - या यदि आप अलग-अलग बाल्टी के साथ खेल रहे हैं और 3-डी में कई उपयोगकर्ताओं का विश्लेषण करना चाहते हैं (एक्स, वाई यूआईडी, बाल्टी के खिलाफ ज़ेड में मापें):

SELECT uid
    ,bucket
    ,COUNT(*) AS measure
FROM (
    SELECT uid
        ,DATEADD(day, DATEDIFF(day, 0, timefield), 0) AS bucket
    FROM entries
) AS buckets
GROUP BY uid
    ,bucket
ORDER BY uid
    ,bucket

अगर मैं 3-डी में प्लॉट करना चाहता था, तो मैं शायद उपयोगकर्ता के लिए कुछ सार्थक समग्र मीट्रिक के अनुसार उपयोगकर्ताओं को ऑर्डर करने का एक तरीका निर्धारित करूंगा।

0
जोड़ा
नहीं, आप नहीं कर सकते हैं, हालांकि, अनुकूलक वास्तव में उन अभिव्यक्तियों की पुन: गणना नहीं करता है, क्योंकि यह जानता है कि कार्य निर्धारक हैं।
जोड़ा लेखक Cade Roux, स्रोत
क्या आप "बाल्टी द्वारा बाल्टी ऑर्डर द्वारा ग्रुप" कर सकते हैं? ऐसा लगता है कि यह अधिक कुशल होगा (हर बार उस कॉलम को फिर से समझना नहीं है)
जोड़ा लेखक nickf, स्रोत

Michal Sznajder लगभग यह था, लेकिन आप एसक्यूएल में WHERE खंड में कॉलम उपनाम का उपयोग नहीं कर सकते हैं। तो आपको इसे व्युत्पन्न तालिका के रूप में लपेटना होगा। मैंने कोशिश की और यह 20 पंक्तियां देता है:

SELECT * FROM (
    SELECT @rownum:[email protected]+1 AS rownum, e.*
    FROM (SELECT @rownum := 0) r, entries e) AS e2
WHERE uid = ? AND rownum % 150 = 0;
0
जोड़ा
select timefield
from entries
where rand() = .01 --will return 1% of rows adjust as needed.

एक MySQL विशेषज्ञ नहीं है इसलिए मुझे यकीन नहीं है कि इस वातावरण में कैसे रैंड() संचालित होता है।

0
जोड़ा
यह "रैंड() <.01" होना चाहिए
जोड़ा लेखक nickf, स्रोत

क्या आप वास्तव में व्यक्तिगत डेटा बिंदुओं की परवाह करते हैं? या दिन के नंबर पर सांख्यिकीय समग्र कार्यों का उपयोग करने के बजाय आपको यह बताने के लिए पर्याप्त होगा कि आप क्या जानना चाहते हैं?

0
जोड़ा