2008-08-06 9 views
11

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

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

मैं ऐसा कर सकता है:

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

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

या मैं 20 अलग-अलग प्रश्न पूछ सकता हूं और limit 1 और offset का उपयोग कर सकता हूं।

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

+0

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

उत्तर

6

मीकल 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; 
1

कुछ इस तरह मेरे हाथ में मेरे मन

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

मैं MySQL की जरूरत नहीं है के लिए आया था लेकिन शायद इस में मदद मिलेगी ...

0

@Michal

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

मूल तालिका एक ऑटो की संख्या बढ़ आईडी स्तंभ है, और पंक्तियों कालानुक्रमिक क्रम में डाला गया है, तो इस काम करना चाहिए:

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

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

0

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

0
select timefield 
from entries 
where rand() = .01 --will return 1% of rows adjust as needed. 

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

+0

जो "रैंड() <.01" – nickf

1

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

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-डी (मात्रा में कई उपयोगकर्ताओं के लिए विश्लेषण करना चाहते हैं, वाई uid , बाल्टी):

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

होना चाहिए "क्या आप बाल्टी ऑर्डर बाल्टी द्वारा" कर सकते हैं? ऐसा लगता है कि यह अधिक कुशल होगा (हर बार उस कॉलम को फिर से गणना नहीं करना) – nickf

+0

नहीं, आप नहीं कर सकते हैं, हालांकि, अनुकूलक वास्तव में उन अभिव्यक्तियों की पुन: गणना नहीं करता है, क्योंकि यह जानता है कि कार्य निर्धारित हैं। –

0

मेरे संदर्भ के लिए - - और उन postgres प्रयोग करने के लिए Postgres 9.4 सेट समुच्चय है कि इस समस्या का समाधान करना चाहिए आदेश दिया गया होगा:

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

स्रोत: http://www.craigkerstiens.com/2014/02/02/Examining-PostgreSQL-9.4/

संबंधित मुद्दे