how to optimise this group by on sys.dm_exec_query_stats?
You're getting multiple queries from within the same stored procedure but because you're just looking at execsql.text you're getting the whole body of the procedure. If you want to know the individual queries you need to extract those. (The solution is definitely not to try to group by the entire procedure body.) Try this query:

SELECT TOP (1008)
  execquery.last_execution_time AS [Date Time], 
  Database_Name = DB_NAME (execsql.dbid),
  [Script] = SUBSTRING(execsql.text, (execquery.statement_start_offset/2) + 1,
    (( CASE execquery.statement_end_offset
        WHEN -1 THEN DATALENGTH(execsql.text)
        ELSE execquery.statement_end_offset END 
            - execquery.statement_start_offset)/2) + 2)
FROM sys.dm_exec_query_stats AS execquery
CROSS APPLY sys.dm_exec_sql_text(execquery.sql_handle) AS execsql
ORDER BY execquery.last_execution_time DESC;