1 सवाल: विभिन्न निर्धारित समय अंतरालों पर विशिष्ट स्थिति में आईडी की गणना

पर बनाया गया सवाल Tue, Apr 9, 2019 12:00 AM

Im उन स्थितियों की पहचान करने के लिए एक हिस्टोग्राम बनाने की कोशिश कर रहा है, जहां बड़ी संख्या में 'ID की स्थिति एक साथ "CASTING" है।

आप देखेंगे कि मेरे पास एक रैंक कॉलम मौजूद है - मैंने कई तरीकों से इस समस्या का प्रयास किया है, सबसे हाल ही में आईडी पर विभाजन करना था, इवेंट_टाइम कॉलम को निकटतम 15 मिनट के अंतराल पर गोल करके और फिर गिनती करके अंतराल द्वारा "कास्टिंग" स्थिति के साथ आईडी की संख्या। दुर्भाग्य से, यह मुझे नहीं मिलता है जहां मुझे होने की आवश्यकता है, क्योंकि यह केवल विशिष्ट समय अंतराल से पहले 'कास्टिंग' पर उन लोगों को शामिल करके वर्तमान स्थिति को बदलने के बजाय स्थिति परिवर्तन के उदाहरणों को प्रस्तुत करता है।

मैं बीच में 15 मिनट के अंतराल की सूची बनाने के लिए दिशा का अभाव है 14:00 और 17:30 (यदि यह भी संभव है?!) - अत्यधिक आवश्यक नहीं है क्योंकि मैं उन्हें हार्डकॉडिंग का सहारा ले सकता हूं और शायद सूची में किसी प्रकार का प्रदर्शन कर रहा हूं।

मुझे लगता है कि मैं इस समस्या को इतने लंबे समय से देख रहा हूं, कि मैं स्पष्ट समाधान नहीं देख पा रहा हूं ... क्या कोई ऐसा तरीका है जो नीचे दिए गए वांछित परिणाम प्राप्त करने के लिए मैं किस पद्धति का उपयोग कर सकता हूं?

यहां एक परीक्षण डेटासेट है:

CREATE TABLE Table1
    (`id` varchar(1), `loc` int, `status` varchar(7), `date` datetime, `event_time` datetime, `rnk` int)
;

INSERT INTO Table1
    (`id`, `loc`, `status`, `date`, `event_time`, `rnk`)
VALUES
    ('A', 1, 'READY', '2019-08-04 00:00:00', '2019-08-04 15:39:00', 1),
    ('A', 1, 'CASTING', '2019-08-04 00:00:00', '2019-08-04 14:09:00', 1),
    ('A', 1, 'QUEUED', '2019-08-04 00:00:00', '2019-08-04 12:59:00', 1),
    ('B', 1, 'READY', '2019-08-04 00:00:00', '2019-08-04 23:59:00', 1),
    ('B', 1, 'CASTING', '2019-08-04 00:00:00', '2019-08-04 13:52:00', 1),
    ('B', 1, 'QUEUED', '2019-08-04 00:00:00', '2019-08-04 13:44:00', 1),
    ('C', 1, 'READY', '2019-08-04 00:00:00', '2019-08-04 17:59:00', 1),
    ('C', 1, 'CASTING', '2019-08-04 00:00:00', '2019-08-04 14:59:00', 1),
    ('C', 1, 'QUEUED', '2019-08-04 00:00:00', '2019-08-04 11:59:00', 1),
    ('D', 1, 'READY', '2019-08-04 00:00:00', '2019-08-04 13:59:00', 1),
    ('D', 1, 'CASTING', '2019-08-04 00:00:00', '2019-08-04 12:59:00', 1),
    ('D', 1, 'QUEUED', '2019-08-04 00:00:00', '2019-08-04 11:59:00', 1),
    ('E', 1, 'READY', '2019-08-04 00:00:00', '2019-08-04 21:51:00', 1),
    ('E', 1, 'CASTING', '2019-08-04 00:00:00', '2019-08-04 18:59:00', 1),
    ('E', 1, 'QUEUED', '2019-08-04 00:00:00', '2019-08-04 11:59:00', 1)
;

मेरा आउटपुट कुछ इस तरह दिखना चाहिए:

Date    Count_at_casting
08/04/2019 14:00    1
08/04/2019 14:15    2
08/04/2019 14:30    2
08/04/2019 14:45    2
08/04/2019 15:00    3
08/04/2019 15:15    3
08/04/2019 15:30    3
08/04/2019 15:45    2
08/04/2019 16:00    2
08/04/2019 16:15    2
08/04/2019 16:30    2
08/04/2019 16:45    2
08/04/2019 17:00    2
08/04/2019 17:15    2
08/04/2019 17:30    2

Id  loc status  date                START               END
A   1   CASTING 08/04/2019 00:00    08/04/2019 14:09    08/04/2019 15:39
B   1   CASTING 08/04/2019 00:00    08/04/2019 13:52    08/04/2019 23:59
C   1   CASTING 08/04/2019 00:00    08/04/2019 14:59    08/04/2019 17:59
D   1   CASTING 08/04/2019 00:00    08/04/2019 12:59    08/04/2019 13:59
E   1   CASTING 08/04/2019 00:00    08/04/2019 18:59    08/04/2019 21:51
    
0
1 उत्तर                              1                         

आपका आउटपुट आपके इनपुट से मेल नहीं खाता - मेरा मानना ​​है कि यह सिर्फ एक नमूना है। निम्नलिखित के लिए oracle है। [दोहरे में] ओरेकल में सिर्फ 1 पंक्ति का चयन करना है और सबसे पहले इनपुट अनुकरण करना है। Oracle to_char और to_date तार को तिथि में परिवर्तित करें। इसी तरह के कार्य sqlserver में दिनांक प्रकार के कार्यों के साथ उपलब्ध हैं

[
with table1 as (
select 'A' id, 1 loc, 'READY' status, to_date('2019-08-04 00:00:00','YYYY-MM-DD HH24:MI:SS') datetime, to_date('2019-08-04 15:39:00', 'YYYY-MM-DD HH24:MI:SS') event_time from dual union all
select 'A', 1, 'CASTING', to_date('2019-08-04 00:00:00','YYYY-MM-DD HH24:MI:SS'), to_date('2019-08-04 14:09:00', 'YYYY-MM-DD HH24:MI:SS')  from dual union all
select 'A', 1, 'QUEUED', to_date('2019-08-04 00:00:00','YYYY-MM-DD HH24:MI:SS'), to_date('2019-08-04 12:59:00', 'YYYY-MM-DD HH24:MI:SS')  from dual union all
select 'B', 1, 'READY', to_date('2019-08-04 00:00:00','YYYY-MM-DD HH24:MI:SS'), to_date('2019-08-04 23:59:00', 'YYYY-MM-DD HH24:MI:SS')  from dual union all
select 'B', 1, 'CASTING', to_date('2019-08-04 00:00:00','YYYY-MM-DD HH24:MI:SS'), to_date('2019-08-04 13:52:00', 'YYYY-MM-DD HH24:MI:SS')  from dual union all
select 'B', 1, 'QUEUED', to_date('2019-08-04 00:00:00','YYYY-MM-DD HH24:MI:SS'), to_date('2019-08-04 13:44:00', 'YYYY-MM-DD HH24:MI:SS')  from dual union all
select 'C', 1, 'READY', to_date('2019-08-04 00:00:00','YYYY-MM-DD HH24:MI:SS'), to_date('2019-08-04 17:59:00', 'YYYY-MM-DD HH24:MI:SS')  from dual union all
select 'C', 1, 'CASTING', to_date('2019-08-04 00:00:00','YYYY-MM-DD HH24:MI:SS'), to_date('2019-08-04 14:59:00', 'YYYY-MM-DD HH24:MI:SS')  from dual union all
select 'C', 1, 'QUEUED', to_date('2019-08-04 00:00:00','YYYY-MM-DD HH24:MI:SS'), to_date('2019-08-04 17:59:00', 'YYYY-MM-DD HH24:MI:SS')  from dual union all
select 'D', 1, 'READY', to_date('2019-08-04 00:00:00','YYYY-MM-DD HH24:MI:SS'), to_date('2019-08-04 13:59:00', 'YYYY-MM-DD HH24:MI:SS')  from dual union all
select 'D', 1, 'CASTING', to_date('2019-08-04 00:00:00','YYYY-MM-DD HH24:MI:SS'), to_date('2019-08-04 12:59:00', 'YYYY-MM-DD HH24:MI:SS')  from dual union all
select 'D', 1, 'QUEUED', to_date('2019-08-04 00:00:00','YYYY-MM-DD HH24:MI:SS'), to_date('2019-08-04 11:59:00', 'YYYY-MM-DD HH24:MI:SS')  from dual union all
select 'E', 1, 'READY', to_date('2019-08-04 00:00:00','YYYY-MM-DD HH24:MI:SS'), to_date('2019-08-04 21:51:00', 'YYYY-MM-DD HH24:MI:SS')  from dual union all
select 'E', 1, 'CASTING', to_date('2019-08-04 00:00:00','YYYY-MM-DD HH24:MI:SS'), to_date('2019-08-04 18:59:00', 'YYYY-MM-DD HH24:MI:SS')  from dual union all
select 'E', 1, 'QUEUED', to_date('2019-08-04 00:00:00','YYYY-MM-DD HH24:MI:SS'), to_date('2019-08-04 11:59:00', 'YYYY-MM-DD HH24:MI:SS') from dual
),
table1_with_rounded_min as
(
    select y.*,
           to_date(to_char(event_time,'YYYYMMDDHH24') || ltrim(to_char(event_round_15)),'YYYYMMDDHH24MI') event_time_round15
    from
    (
        select x.*,
               trunc(x.event_min / 15)*15 event_round_15
        from
        (
            select table1.*, to_char(event_time,'MI') event_min
            from table1
        ) x
    ) y
)
select to_char(event_time_round15, 'MM/DD/YY HH24:MI') date1, 
       sum(case when status = 'CASTING' then 1 else 0 end) Count_at_casting
from table1_with_rounded_min
group by event_time_round15
order by 1
]
    
0
2019-04-09 17: 41: 32Z
  1. हाय साद, योगदान के लिए धन्यवाद। हालांकि, यह समाधान मेरे पिछले प्रयासों में से एक के समान है - जहां यह प्रत्येक अंतराल पर स्थिति की गिनती = 'कास्टिंग' के बराबर है। जो मैं लक्ष्य कर रहा हूं वह स्थिति का कुल चल रहा है = 'CASTING', शुरुआत को निरूपित करने के लिए 'CASTING' लाइन के टाइमस्टैम्प का उपयोग करते हुए, और 'CASTING' लाइन के अंत में इस विशेष ID के लिए अगली स्थिति अपडेट है।
    2019-04-10 10: 21: 48Z
  2. आपके उदाहरण में सटीक आउटपुट के लिए क्या होना चाहिए?
    2019-04-10 10: 32: 01Z
  3. मैंने इसे स्कीमा जानकारी से मिलान करने के लिए अपेक्षित आउटपुट को सही किया है - मैंने पहले प्रयास में इसे गलत तरीके से समझा होगा। धन्यवाद फिर से साद!
    2019-04-10 11: 58: 22Z
  4. क्या आप बता सकते हैं कि 14:15 और 14:30 पर गिनती कैसे बढ़ी? मुझे लगता है कि 14:09 14:00 गोलाई के लिए है तो 1 समझ में आता है। कृपया अपने परिणाम के साथ एक टिप्पणी दें कि यह क्यों बढ़ रहा है। इसके अलावा समय सीमा - क्या वह स्वतंत्र है। यानी उदाहरण के लिए यदि आपकी तालिका खाली है - आप अभी भी उम्मीद करते हैं कि कई पंक्तियाँ? क्योंकि आपके डेटा सेट में हर समय
    नहीं है
    2019-04-10 12: 35: 27Z
  5. मैंने नीचे एक अतिरिक्त तालिका में जोड़ा है जिसे मैंने मुख्य तालिका से निकाला है, उस स्थिति के प्रारंभ समय का उपयोग करके 'कास्टिंग' के लिए एक शुरुआत और अंत समय प्रदान करता हूं और अगली स्थिति का प्रारंभ समय। @ 14:00 - एकमात्र आईडी जो सक्रिय है वह बी है। 14:15 बजे तक, बी और ए दोनों सक्रिय हैं। आदर्श रूप से मेरे आउटपुट में प्रति दिन अंतराल की समान सूची है, लेकिन यदि कोई आईडी सक्रिय नहीं है, तो मान शून्य होगा। अगर आपको किसी और स्पष्टता की आवश्यकता है, तो मुझे बताएं!
    2019-04-10 12: 58: 15Z
स्रोत रखा गया यहाँ