LAG and GROUP BY not compatible in Maria DB SQL

107 views Asked by At

I have this SQL query in MariaDB

  SELECT substr(sqlth_te.tagpath, 32), stringvalue,
    ((t_stamp - (CASE WHEN sqlth_te.tagpath = LAG(sqlth_te.tagpath,1) OVER (ORDER BY sqlth_te.tagpath, t_stamp) Then LAG(t_stamp,1) OVER (ORDER BY sqlth_te.tagpath, t_stamp)
    ELSE NULL
    END))/1000) as seconds
    FROM sqlt_data_1_2022_04
    LEFT JOIN sqlth_te
    ON sqlt_data_1_2022_04.tagid = sqlth_te.id
    WHERE stringvalue IS NOT NULL
    ORDER BY sqlth_te.tagpath, t_stamp

sql code

Which returns 3 columns; a column with machine names, running status, and duration since status change.

results

I'd like to sum the duration by machine name and running status, but when I try to add a sum and group by I get an error.

SELECT substr(sqlth_te.tagpath, 32), stringvalue,
SUM((t_stamp - (CASE WHEN sqlth_te.tagpath = LAG(sqlth_te.tagpath,1) OVER (ORDER BY sqlth_te.tagpath, t_stamp) Then LAG(t_stamp,1) OVER (ORDER BY sqlth_te.tagpath, t_stamp)
ELSE NULL
END))/1000) as seconds
FROM sqlt_data_1_2022_04
LEFT JOIN sqlth_te
ON sqlt_data_1_2022_04.tagid = sqlth_te.id
WHERE stringvalue IS NOT NULL
ORDER BY sqlth_te.tagpath, t_stamp
GROUP BY substr(sqlth_te.tagpath, 32), stringvalue

Error: java.sql.SQLSyntaxErrorException: (conn=8) You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'GROUP BY substr(sqlth_te.tagpath, 32), stringvalue' at line 10

Any ideas of what I'm doing wrong or if it's possible to group a column generated with the lag function?

Thanks

1

There are 1 answers

2
BeRT2me On BEST ANSWER

First thing: The GROUP BY should come before the ORDER BY

You may also need to nest it like this:

SELECT tagpath, stringvalue, SUM(seconds) as seconds
  FROM (
  SELECT substr(sqlth_te.tagpath, 32) as tagpath, stringvalue,
    ((t_stamp - (CASE WHEN sqlth_te.tagpath = LAG(sqlth_te.tagpath,1) OVER (ORDER BY sqlth_te.tagpath, t_stamp) Then LAG(t_stamp,1) OVER (ORDER BY sqlth_te.tagpath, t_stamp)
    ELSE NULL
    END))/1000) as seconds
    FROM sqlt_data_1_2022_04
    LEFT JOIN sqlth_te
    ON sqlt_data_1_2022_04.tagid = sqlth_te.id
    WHERE stringvalue IS NOT NULL
)
GROUP BY tagpath, stringvalue
ORDER BY tagpath, stringvalue