Search code examples
sqlsql-serverapache-superset

Cannot use an aggregate or a subquery in an expression used for the group by list of a GROUP BY clause (Ms sql + Superset)


I have a table offset_table in which the offset in minutes are written. This table will have exactly 1 record and 1 column.

So I need to add those number of minutes into the registration_time.

I have tried it using following approaches. But no luck.

Approach 1 :

    SELECT 
    DATEPART(week, CAST(DATEADD(MINUTE,(select offset from offset_table) , registration_time) as date)) as weeknumber
    FROM 
    registration
    GROUP BY
    DATEPART(week, CAST(DATEADD(MINUTE,(select offset from offset_table)  , registration_time) as date));

Error : Cannot use an aggregate or a subquery in an expression used for the group by list of a GROUP BY clause.

Approach 2 :

    SELECT 
    DATEPART(week, CAST(DATEADD(MINUTE,(select offset from offset_table) , registration_time) as date)) as weeknumber
    FROM 
    registration
    GROUP BY
    weeknumber;

Error : Invalid column name 'weeknumber'.

Approach 3 :

DECLARE @offsetInMin int;
SET @offsetInMin = (select offset from offset_table);

 SELECT 
    DATEPART(week, CAST(DATEADD(MINUTE,@offsetInMin , registration_time) as date)) as weeknumber
    FROM 
    registration
    GROUP BY
    DATEPART(week, CAST(DATEADD(MINUTE,@offsetInMin  , registration_time) as date));

Issue with Approach 3 : This query works fine. But problem is this , I need this query in Apache Superset as virtual table query. So If I declare the variable then it gives error on superset.

Error: Virtual dataset query cannot consist of multiple statements"

So please guide me how can I fix the problem?


Solution

  • As @Larnu mentoined, you can CROSS JOIN the offset_table, since it only contains 1 value. I am assuming you need the GROUP BY to do an aggregation? If not, you do not need to use GROUP BY here at all. If you want to avoid getting duplicate records, use SELECT DISTINCT.

    SELECT 
    DATEPART(week, CAST(DATEADD(MINUTE, offset_table.offset, registration_time) as date)) as weeknumber
    FROM 
    registration
    CROSS JOIN offset_table
    GROUP BY
    DATEPART(week, CAST(DATEADD(MINUTE, offset_table.offset, registration_time) as date));