简体   繁体   中英

mysql query to select row wise data as column wise data with condition

I have a mysql table "VIEWERS" :

  c_id     C_time                     C_count
 -------------------------------------------------
   C1      2020-01-15 09:00:00          125
   C2      2020-01-15 09:00:00          135
   C1      2020-01-15 09:05:00          115
   C2      2020-01-15 09:05:00          155
   C1      2020-01-15 09:10:00          175
   C2      2020-01-15 09:10:00          25
   C1      2020-01-15 09:15:00          325
   C2      2020-01-15 09:15:00          425
   C1      2020-01-15 09:20:00          325
   C2      2020-01-15 09:20:00          425
   C1      2020-01-15 09:25:00          225
   C2      2020-01-15 09:25:00          725

How do I query the database to return average C_count of C_id between 10 minutes gap in column wise. as follows :

    C_time                     C1            C2       
   ------------------------------------------------------
    2020-01-15 09:00:00        120           145
    2020-01-15 09:10:00        250           225
    2020-01-15 09:20:00        275           575       

Use UNIX_TIMESTAMP to convert datetime value. Do a floor division by 10 min x 60 second, then multiply it by 10x60 again. Then aggregate based on that division.

SELECT 
  FROM_UNIXTIME(v1.c_unix_floor) datetime_interval10min, 
  AVG(IF(v1.c_id='C1', v1.c_count, NULL)) total_c1, 
  AVG(IF(v1.c_id='C2', v1.c_count, NULL)) total_c2 
FROM (
  SELECT v.c_id, v.c_count, FLOOR(UNIX_TIMESTAMP(v.c_time) / (10*60)) * (10*60) AS c_unix_floor 
  FROM viewers v
) AS v1 GROUP BY FROM_UNIXTIME(v1.c_unix_floor);

Result:

MariaDB [test]> SELECT
    ->   FROM_UNIXTIME(v1.c_unix_floor) datetime_interval10min,
    ->   AVG(IF(v1.c_id='C1', v1.c_count, NULL)) total_c1,
    ->   AVG(IF(v1.c_id='C2', v1.c_count, NULL)) total_c2
    -> FROM (
    ->   SELECT v.c_id, v.c_count, FLOOR(UNIX_TIMESTAMP(v.c_time) / (10*60)) * (60*10) AS c_unix_floor
    ->   FROM viewers v
    -> ) AS v1 GROUP BY FROM_UNIXTIME(v1.c_unix_floor);
+------------------------+----------+----------+
| datetime_interval10min | total_c1 | total_c2 |
+------------------------+----------+----------+
| 2020-01-15 09:00:00    |      120 |      145 |
| 2020-01-15 09:10:00    |      250 |      225 |
| 2020-01-15 09:20:00    |      275 |      575 |
+------------------------+----------+----------+
3 rows in set (0.00 sec)

Table creation query:

CREATE viewers AS
SELECT 'C1' c_id,'2020-01-15 09:00:00' c_time,'125' c_count UNION 
SELECT 'C2','2020-01-15 09:00:00','135' UNION 
SELECT 'C1','2020-01-15 09:05:00','115' UNION 
SELECT 'C2','2020-01-15 09:05:00','155' UNION 
SELECT 'C1','2020-01-15 09:10:00','175' UNION 
SELECT 'C2','2020-01-15 09:10:00','25' UNION 
SELECT 'C1','2020-01-15 09:15:00','325' UNION 
SELECT 'C2','2020-01-15 09:15:00','425' UNION 
SELECT 'C1','2020-01-15 09:20:00','325' UNION 
SELECT 'C2','2020-01-15 09:20:00','425' UNION 
SELECT 'C1','2020-01-15 09:25:00','225' UNION 
SELECT 'C2','2020-01-15 09:25:00','725'

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM