MySQL दी गई स्थिति के लिए दो तिथियों के बीच लापता तिथियां भरें



नंदा तिथि (2)

मेरे पास परियोजनाओं का एक डाटा सेट है प्रोजेक्ट्स की स्थिति बदलती से समाप्त होती है, और स्थिति परिवर्तन की तारीख एक तालिका में लॉग होती है (टेबल नाम "ईवेंट" है - मेरी पसंद नहीं)। यह (सरलीकृत) दिखेगा:

Date        Status
2015-06-01  Start
2015-06-03  Stage 2
2015-06-07  Stage 3

किसी भी तारीखित सीमा में (गतिशील रूप से निर्धारित किया जा सकता है) मैं देखना चाहता हूं कि कौन सी परियोजनाएं स्थिति पर हैं हालांकि, डेटा के विरुद्ध या अन्य क्वेरी के जरिए उपयोग किए जाने वाले उन परियोजनाओं को ही खींच लिया जाएगा जिनकी स्थिति उस अवधि के दौरान बदल दी गई थी, न कि किसी दिए गए स्थिति में हैं।

मैंने वर्तमान में एक्सेल में एक बहुत ही क्लैकी समाधान बनाया है, जो पंक्तियों की स्थिति बदलती तारीखों के बीच नई पंक्तियों में प्रतिलिपि बनाता है, जैसे:

Date          Status  
2015-06-01    Project start
2015-06-02    Project start (copied)
2015-06-03    Stage 2 
2015-06-04    Stage 2 (copied)
2015-06-05    Stage 2 (copied)
2015-06-06    Stage 2 (copied)
2015-06-07    Stage 3

यह समाधान मुझे 2015-06-06 के प्रोजेक्ट के लिए स्थिति की क्वेरी करने की अनुमति देता है और देखें कि यह चरण 2 पर अभी भी है।

क्या इस तरह के डेटा को खींचने के लिए मैं अपने एसक्यूएल का उपयोग कर सकता हूं, लेकिन एक क्वेरी के आउटपुट के रूप में? मैंने कुछ सुझाव हैं कि एक कैलेंडर तालिका का उपयोग करने के लिए, लेकिन मुझे यकीन नहीं है कि यह कैसे काम करेगा। मैंने देखा है कि किसी ने क्रॉस में शामिल होने की सिफारिश की है, लेकिन फिर से, मैं इस विवरण से नहीं समझा सकता कि यह कैसे काम करेगा।

आपकी सहायता के लिये पहले से ही धन्यवाद!


Answer #1

आपको सभी तिथियों के साथ तालिका बनाने की आवश्यकता नहीं है। आप अपनी तालिका को प्रत्येक स्थिति के लिए आरंभ और समाप्ति तिथियां दे सकते हैं और कथन के बीच का उपयोग कर सकते हैं।

या अपने मौजूदा डेटा का उपयोग कर।

दिनांक के रूप में @डेटेरीज़ का उपयोग करके उस तिथि के लिए जिसकी स्थिति आप जानना चाहते हैं।

Select top 1 Status from Events
where Date <= @datequery and Date 
order by Date desc

आपके द्वारा पूछताछ की जाने वाली तिथि से सबसे हाल की स्थिति में बदलाव लौटाता है।

@datequery = 2015-06-06

Status
Stage 2

Answer #2

योजना

  • कैलेंडर अवधि पर क्रॉस जॉइनिंग डिजिट्स और डेट_एड द्वारा कैलेंडर तालिका बनाएं ..
  • अपने डेटा को कैलेंडर स्रोत के साथ तिथि <= कैलेंडर तारीख से जुड़ें
  • अधिकतम तिथि <= कैलेंडर तारीख लें
  • स्थिति प्राप्त करने के लिए मूल डेटा स्रोत पर वापस जुड़ें

सेट अप

drop table if exists calendar_t;
CREATE TABLE calendar_t (
  id integer primary key auto_increment not null,
  `date` date not null,
  day varchar(9) not null,
  month varchar(13) not null,
  `year` integer not null
);

drop view if exists digits_v;
create view digits_v
as
select 0 as n
union all
select 1
union all
select 2
union all
select 3
union all
select 4
union all
select 5
union all
select 6
union all
select 7
union all
select 8
union all
select 9
;

insert into calendar_t
( `date`, day, month, `year` )
select 
date_add('2015-01-01', interval 100*a2.n + 10*a1.n + a0.n day) as `date`,
dayname(date_add('2015-01-01', interval 100*a2.n + 10*a1.n + a0.n day)) as day,
monthname(date_add('2015-01-01', interval 100*a2.n + 10*a1.n + a0.n day)) as month,
year(date_add('2015-01-01', interval 100*a2.n + 10*a1.n + a0.n day)) as `year`
from
digits_v a2
cross join digits_v a1
cross join digits_v a0
order by date_add('2015-01-01', interval 100*a2.n + 10*a1.n + a0.n day)
;

drop table if exists example;
create table example
(
  `date` date not null,
  status varchar(23) not null
);

insert into example
( `date`, status )
values
( '2015-06-01',  'Start'   ),
( '2015-06-03',  'Stage 2' ),
( '2015-06-07',  'Stage 3' )
;

सवाल

select cal_date, mdate, ex2.status
from
(
select cal_date, max(ex_date) as mdate
from
(
select cal.`date` as cal_date, ex.`date` as ex_date
from calendar_t cal
inner join example ex
on ex.`date` <= cal.`date`
) maxs
group by cal_date
) m2
inner join example ex2
on m2.mdate = ex2.`date`
-- pick a reasonable end date for filtering..
where cal_date <= date('2015-06-15')
order by cal_date
;

उत्पादन

+------------------------+------------------------+---------+
|        cal_date        |         mdate          | status  |
+------------------------+------------------------+---------+
| June, 01 2015 00:00:00 | June, 01 2015 00:00:00 | Start   |
| June, 02 2015 00:00:00 | June, 01 2015 00:00:00 | Start   |
| June, 03 2015 00:00:00 | June, 03 2015 00:00:00 | Stage 2 |
| June, 04 2015 00:00:00 | June, 03 2015 00:00:00 | Stage 2 |
| June, 05 2015 00:00:00 | June, 03 2015 00:00:00 | Stage 2 |
| June, 06 2015 00:00:00 | June, 03 2015 00:00:00 | Stage 2 |
| June, 07 2015 00:00:00 | June, 07 2015 00:00:00 | Stage 3 |
| June, 08 2015 00:00:00 | June, 07 2015 00:00:00 | Stage 3 |
| June, 09 2015 00:00:00 | June, 07 2015 00:00:00 | Stage 3 |
| June, 10 2015 00:00:00 | June, 07 2015 00:00:00 | Stage 3 |
| June, 11 2015 00:00:00 | June, 07 2015 00:00:00 | Stage 3 |
| June, 12 2015 00:00:00 | June, 07 2015 00:00:00 | Stage 3 |
| June, 13 2015 00:00:00 | June, 07 2015 00:00:00 | Stage 3 |
| June, 14 2015 00:00:00 | June, 07 2015 00:00:00 | Stage 3 |
| June, 15 2015 00:00:00 | June, 07 2015 00:00:00 | Stage 3 |
+------------------------+------------------------+---------+

sqlfiddle

संदर्भ





date