HEAP: удалить дублирующееся имя и добавить туда значения в одной записи - PullRequest
0 голосов
/ 02 ноября 2018

Я использую HEAP с базой данных MYSQL и хочу получить данные, поэтому я использую запрос ниже.

select SUBSTRING (name, 1, CHARINDEX ('*' , name) - 1) as name, duration
FROM (
           SELECT b."identity" || '*' || session_id || '-' || a.user_id AS "name"
             ,MIN(time) AS "start"
             ,MAX(time) AS "last"
           ,((DATEDIFF('milliseconds', MIN(time), MAX(time))::FLOAT / 1000  ) / 60) AS "duration"

     FROM abc_app_production.all_events a ,abc_app_production.users b
     where    a.user_id = b.user_id
     AND b.user_type IS NOT NULL
     AND b."identity" IS NOT NULL
     AND b."identity" NOT IN ('Shubham')
     AND time >= convert(datetime,'2018-10-01') AND time <= convert(datetime,'2018-11-01')
   GROUP BY 1
     )

Но я получаю дубликаты имени и продолжительности как:

name            duration

John            0.27
John            0.5
Butler          0.0
Tom             29.64
Tom             10.00
Kathi Mike      0.0
Manish          4.38

Но я хочу добавить всю длительность в одну строку, которая повторяется как:

name            duration

John            0.77
Butler          0.0
Tom             39.64
Kathi Mike      0.0
Manish          4.38

Я много пробовал, но получаю ошибки. Пожалуйста, помогите и спасибо заранее.

1 Ответ

0 голосов
/ 02 ноября 2018

Вам нужна агрегация sum (), и вы получаете ошибку, потому что в предложенной вами группе указано неверное место - она ​​должна быть вне подзапроса

select SUBSTRING (name, 1, CHARINDEX ('*' , name) - 1) as name, sum(duration) as duration
FROM (
           SELECT b."identity" || '*' || session_id || '-' || a.user_id AS "name"
             ,MIN(time) AS "start"
             ,MAX(time) AS "last"
           ,((DATEDIFF('milliseconds', MIN(time), MAX(time))::FLOAT / 1000  ) / 60) AS "duration"

     FROM abc_app_production.all_events a ,abc_app_production.users b
     where    a.user_id = b.user_id
     AND b.user_type IS NOT NULL
     AND b."identity" IS NOT NULL
     AND b."identity" NOT IN ('Shubham')
     AND time >= convert(datetime,'2018-10-01') AND time <= convert(datetime,'2018-11-01') 
     group by b."identity" || '*' || session_id || '-' || a.user_id
)X group by SUBSTRING (name, 1, CHARINDEX ('*' , name) - 1)
...