शीर्षक वास्तव में समस्या का पूरी तरह से वर्णन नहीं करता है, अर्थात: मेरे पास तिथियों वाली एक तालिका है -

 1. 2011-07-01 13:01:48
 2. 2011-07-01 13:09:36 
 3. 2011-07-01 13:21:24
 4. 2011-07-01 13:35:12
 5. 2011-07-01 13:49:23
 6. 2011-07-01 13:57:47
 7. 2011-07-01 14:05:12
 8. 2011-07-01 14:12:45
 9. 2011-07-01 14:31:48
 10. 2011-07-01 14:47:31

और इसी तरह। मुझे प्रत्येक घंटे की तीन यादृच्छिक तिथियां प्राप्त करने की आवश्यकता है, उदाहरण के लिए:

 1. 2011-07-01 13:01:48
 2. 2011-07-01 13:21:24
 3. 2011-07-01 13:49:23
 4. 2011-07-01 14:05:12
 5. 2011-07-01 14:12:45
 6. 2011-07-01 14:47:31

मैं इसे MySQL में कैसे कर सकता हूं?

7
Vadim Samokhin 11 जुलाई 2011, 17:02

4 जवाब

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

यदि आपके पास प्रति घंटे सांख्यिकीय रूप से पर्याप्त पंक्तियाँ हैं तो यह बहुत अच्छी तरह से काम करना चाहिए:

select *
from (
    select *
    from yourtable
    order by rand()
)
group by date(yourdate), hour(yourdate), floor(rand()*3)
1
Karolis 11 जुलाई 2011, 23:35
create table dates (`date` datetime);
insert into dates (`date`) values
('2011-07-11 06:05:02'),
('2011-07-11 06:15:02'),
('2011-07-11 06:45:02'),
('2011-07-11 06:55:02'),
('2011-07-11 06:56:02'),
('2011-07-11 08:05:02'),
('2011-07-11 08:07:02'),
('2011-07-11 08:09:02'),
('2011-07-11 08:11:02'),
('2011-07-11 08:40:02'),
('2011-07-11 09:05:02'),
('2011-07-11 11:10:02'),
('2011-07-11 11:11:02'),
('2011-07-11 11:55:02')
;

set @i := 0;
set @d := '';
select `date`
from (
    select  
        case 
            when @d != date_format(`date`, '%Y-%m-%d %H') 
            then @i := 0
            else @i := @i + 1
        end as i,
        case
            when @d != date_format(`date`, '%Y-%m-%d %H') 
            then @d := date_format(`date`, '%Y-%m-%d %H')
        end as d,
        case when @i < 3 then `date` else null end as `date`
    from (
        select `date`
        from dates
        order by date_format(`date`, '%Y-%m-%d %H'), rand()
    ) ss
) sw
where `date` is not null
order by `date`
;
2
Clodoaldo Neto 12 जुलाई 2011, 07:47

यदि डेटा सेट बड़ा नहीं है - यदि आपका डेटा सेट बड़ा है तो आपको डेटा सेट पर कुछ यादृच्छिक एल्गोरिदम का उपयोग नहीं करना चाहिए, फिर आप निम्न सरल क्वेरी का उपयोग कर सकते हैं:

select * from t order by rand() limit 6;
1
James.Xu 11 जुलाई 2011, 18:48

एक चीज जो आप कर सकते हैं वह है कि आपको जो कुछ भी चाहिए उसे चुनने के लिए क्वेरी लिखें, फिर परिणामों को किसी सरणी या अस्थायी तालिका में संग्रहीत करें। यदि आप एक अस्थायी तालिका का उपयोग करते हैं, तो अनुक्रमणिका के लिए एक स्तंभ जोड़ें, और जब आप अपना डेटा अस्थायी तालिका में सम्मिलित करते हैं, तो मान को अनुक्रमणिका स्तंभ में भी लिखें। फिर उस सरणी या अस्थायी तालिका से, यादृच्छिक संख्या जनरेटर द्वारा कभी भी इंडेक्स उत्पन्न होने वाले रिकॉर्ड के लिए क्वेरी करें।

0
John Kane 11 जुलाई 2011, 17:30