मेरे पास एक एसक्यूएल टेबल है जैसा कि नीचे दिखाया गया है।

+---------------------+--------+-------+
|        time         | item   | state |
+---------------------+--------+-------+
| 2019-07-19 1:50:00 | a      |   st1 |
| 2019-07-19 2:51:00 | a      |   st2 |
| 2019-07-19 2:55:00 | b      |   st1 |
| 2019-07-19 2:59:00 | b      |   st2 |
| 2019-07-19 4:30:00 | a      |   st3 |
+---------------------+--------+-------+

मुझे यह पता लगाने की जरूरत है कि आइटम को राज्य को st1 से st2 में बदलने में कितना समय लगा और इसी तरह ..

अंतिम आउटपुट तालिका कुछ इस तरह दिखनी चाहिए।

+--------+------------+---------------+
| item   | st1_to_st2 |   st2_to_st3  | and so on
+--------+------------+---------------+
| a      |   x seconds| w-seconds     |
| b      |   y-seconds| z-seconds     |
+--------+------------+---------------+

क्या आप कृपया मुझे एसक्यूएल के साथ मदद कर सकते हैं।

0
tony 3 पद 2020, 18:06

1 उत्तर

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

राज्यों की एक निश्चित सूची के लिए, आप विंडो फ़ंक्शंस और एकत्रीकरण का उपयोग कर सकते हैं:

select item,
    sum(case when lag_state = 'st1' and state = 'st2' then timestampdiff(second, lag_time, time)) as st1_to_st2,
    sum(case when lag_state = 'st2' and state = 'st3' then timestampdiff(second, lag_time, time)) as st2_to_st3
from (
    select t.*,
        lag(time)  over(partition by item order by state) lag_time,
        lag(state) over(partition by item order by state) lag_state
    from mytable t
) t
group by item

यदि आप कुछ और सामान्य चाहते हैं - यानी जो राज्यों को हार्कोड नहीं करता है - मैं कॉलम की बजाय पंक्तियों में मान डालने की अनुशंसा करता हूं:

select item, lag_state, state, 
    sum(timestampdiff(second, lag_time, time)) as sum_diff
from (
    select t.*,
        lag(time)  over(partition by item order by state) lag_time,
        lag(state) over(partition by item order by state) lag_state
    from mytable t
) t
group by item, lag_state, state
0
GMB 3 पद 2020, 15:13