Skip to content

Instantly share code, notes, and snippets.

@hidayat365
Created August 31, 2017 06:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save hidayat365/b3281790390f481a5de66191e80845e9 to your computer and use it in GitHub Desktop.
Save hidayat365/b3281790390f481a5de66191e80845e9 to your computer and use it in GitHub Desktop.
Grouping by transactions using custom group
-- ---------------------------------------
-- Generate Data
-- ---------------------------------------
CREATE table trans_history AS
SELECT 'TRANS-A' AS transactions, '2017-08-30 08:00:00' AS history UNION ALL
SELECT 'TRANS-A' AS transactions, '2017-08-30 08:10:00' AS history UNION ALL
SELECT 'TRANS-A' AS transactions, '2017-08-30 08:20:00' AS history UNION ALL
SELECT 'TRANS-A' AS transactions, '2017-08-30 08:30:00' AS history UNION ALL
SELECT 'TRANS-A' AS transactions, '2017-08-30 08:40:00' AS history UNION ALL
SELECT 'TRANS-A' AS transactions, '2017-08-30 08:50:00' AS history UNION ALL
SELECT 'TRANS-A' AS transactions, '2017-08-30 09:00:00' AS history UNION ALL
SELECT 'TRANS-B' AS transactions, '2017-08-30 09:10:00' AS history UNION ALL
SELECT 'TRANS-B' AS transactions, '2017-08-30 09:20:00' AS history UNION ALL
SELECT 'TRANS-B' AS transactions, '2017-08-30 09:30:00' AS history UNION ALL
SELECT 'TRANS-B' AS transactions, '2017-08-30 09:40:00' AS history UNION ALL
SELECT 'TRANS-B' AS transactions, '2017-08-30 09:50:00' AS history UNION ALL
SELECT 'TRANS-A' AS transactions, '2017-08-30 10:00:00' AS history UNION ALL
SELECT 'TRANS-A' AS transactions, '2017-08-30 10:10:00' AS history UNION ALL
SELECT 'TRANS-A' AS transactions, '2017-08-30 10:20:00' AS history UNION ALL
SELECT 'TRANS-A' AS transactions, '2017-08-30 10:30:00' AS history UNION ALL
SELECT 'TRANS-A' AS transactions, '2017-08-30 10:40:00' AS history UNION ALL
SELECT 'TRANS-C' AS transactions, '2017-08-30 10:50:00' AS history UNION ALL
SELECT 'TRANS-C' AS transactions, '2017-08-30 11:00:00' AS history UNION ALL
SELECT 'TRANS-C' AS transactions, '2017-08-30 11:10:00' AS history UNION ALL
SELECT 'TRANS-C' AS transactions, '2017-08-30 11:20:00' AS history UNION ALL
SELECT 'TRANS-A' AS transactions, '2017-08-30 11:30:00' AS history UNION ALL
SELECT 'TRANS-A' AS transactions, '2017-08-30 11:40:00' AS history UNION ALL
SELECT 'TRANS-C' AS transactions, '2017-08-30 11:50:00' AS history UNION ALL
SELECT 'TRANS-C' AS transactions, '2017-08-30 12:00:00' AS history UNION ALL
SELECT 'TRANS-C' AS transactions, '2017-08-30 12:10:00' AS history UNION ALL
SELECT 'TRANS-C' AS transactions, '2017-08-30 12:20:00' AS history UNION ALL
SELECT 'TRANS-C' AS transactions, '2017-08-30 12:30:00' AS history UNION ALL
SELECT 'TRANS-B' AS transactions, '2017-08-30 12:40:00' AS history UNION ALL
SELECT 'TRANS-A' AS transactions, '2017-08-30 12:50:00' AS history UNION ALL
SELECT 'TRANS-A' AS transactions, '2017-08-30 13:00:00' AS history UNION ALL
SELECT 'TRANS-A' AS transactions, '2017-08-30 13:10:00' AS history UNION ALL
SELECT 'TRANS-A' AS transactions, '2017-08-30 13:20:00' AS history UNION ALL
SELECT 'TRANS-A' AS transactions, '2017-08-30 13:30:00' AS history UNION ALL
SELECT 'TRANS-A' AS transactions, '2017-08-30 13:40:00' AS history UNION ALL
SELECT 'TRANS-A' AS transactions, '2017-08-30 13:50:00' AS history UNION ALL
SELECT 'TRANS-A' AS transactions, '2017-08-30 14:00:00' AS history UNION ALL
SELECT 'TRANS-A' AS transactions, '2017-08-30 14:10:00' AS history UNION ALL
SELECT 'TRANS-D' AS transactions, '2017-08-30 14:20:00' AS history UNION ALL
SELECT 'TRANS-E' AS transactions, '2017-08-30 14:30:00' AS history UNION ALL
SELECT 'TRANS-E' AS transactions, '2017-08-31 14:30:00' AS history UNION ALL
SELECT 'TRANS-E' AS transactions, '2017-09-01 14:30:00' AS history UNION ALL
SELECT 'TRANS-E' AS transactions, '2017-09-02 14:30:00' AS history UNION ALL
SELECT 'TRANS-E' AS transactions, '2017-09-03 14:30:00' AS history UNION ALL
SELECT 'TRANS-E' AS transactions, '2017-09-04 14:30:00' AS history UNION ALL
SELECT 'TRANS-E' AS transactions, '2017-09-05 14:30:00' AS history UNION ALL
SELECT 'TRANS-E' AS transactions, '2017-09-06 14:30:00' AS history UNION ALL
SELECT 'TRANS-E' AS transactions, '2017-09-07 14:30:00' AS history UNION ALL
SELECT 'TRANS-E' AS transactions, '2017-09-08 14:30:00' AS history UNION ALL
SELECT 'TRANS-E' AS transactions, '2017-09-09 14:30:00' AS history UNION ALL
SELECT 'TRANS-E' AS transactions, '2017-09-10 14:30:00' AS history ;
-- ---------------------------------------
-- Query Data
-- Result: please see comment
-- ---------------------------------------
select min(transactions) transactions
, min(history) awal, max(history) akhir, count(history) jml_data
from (
select d1.transactions, d1.history
, @baris3 := @baris3 + case when d1.transactions = d2.transactions then 0 else 1 end grp
from (
select transactions, history
, @baris1:=@baris1+1 baris
from trans_history
join (select @baris1:=0) t1
order by history
) d1
left join (
select transactions, history
, @baris2:=@baris2+1 baris
from trans_history
join (select @baris2:=1) t2
order by history
) d2
on d1.baris = d2.baris
join (select @baris3:=0) t3
order by d1.history, d1.transactions
) d3
group by grp
@hidayat365
Copy link
Author

hidayat365 commented Aug 31, 2017

D:\xampp\mysql\bin>mysql test
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 3
Server version: 10.1.13-MariaDB mariadb.org binary distribution

Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [test]> select min(transactions) transactions
    -> , min(history) awal, max(history) akhir, count(history) jml_data
    -> from (
    -> select d1.transactions, d1.history
    ->     , @baris3 := @baris3 + case when d1.transactions = d2.transactions then 0 else 1 end grp
    ->     from (
    ->         select transactions, history
    ->         , @baris1:=@baris1+1 baris
    ->         from trans_history
    ->         join (select @baris1:=0) t1
    ->         order by history
    ->     ) d1
    ->     left join (
    ->         select transactions, history
    ->         , @baris2:=@baris2+1 baris
    ->         from trans_history
    ->         join (select @baris2:=1) t2
    ->         order by history
    ->     ) d2
    ->     on d1.baris = d2.baris
    ->     join (select @baris3:=0) t3
    ->     order by d1.history, d1.transactions
    -> ) d3
    -> group by grp;
+--------------+---------------------+---------------------+----------+
| transactions | awal                | akhir               | jml_data |
+--------------+---------------------+---------------------+----------+
| TRANS-A      | 2017-08-30 08:00:00 | 2017-08-30 09:00:00 |        7 |
| TRANS-B      | 2017-08-30 09:10:00 | 2017-08-30 09:50:00 |        5 |
| TRANS-A      | 2017-08-30 10:00:00 | 2017-08-30 10:40:00 |        5 |
| TRANS-C      | 2017-08-30 10:50:00 | 2017-08-30 11:20:00 |        4 |
| TRANS-A      | 2017-08-30 11:30:00 | 2017-08-30 11:40:00 |        2 |
| TRANS-C      | 2017-08-30 11:50:00 | 2017-08-30 12:30:00 |        5 |
| TRANS-B      | 2017-08-30 12:40:00 | 2017-08-30 12:40:00 |        1 |
| TRANS-A      | 2017-08-30 12:50:00 | 2017-08-30 14:10:00 |        9 |
| TRANS-D      | 2017-08-30 14:20:00 | 2017-08-30 14:20:00 |        1 |
| TRANS-E      | 2017-08-30 14:30:00 | 2017-08-31 14:40:00 |        2 |
+--------------+---------------------+---------------------+----------+
10 rows in set (0.00 sec)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment