Как рассчитать разницу дат для групповых данных - PullRequest
0 голосов
/ 03 мая 2018

Я бы хотел посчитать разницу между датой и временем, когда я группирую данные.

Давайте рассмотрим пример содержания таблицы:

id | session_id | created
1  | 101        | 1/10/2010 9:30:10
2  | 102        | 1/10/2010 9:31:10
3  | 101        | 1/10/2010 9:32:10
4  | 103        | 1/10/2010 9:35:10
5  | 102        | 1/10/2010 9:38:10
6  | 103        | 1/10/2010 9:39:10

Вывод должен быть следующим:

session_id | time_count
101        | 2 (minutes)
102        | 7 (minutes)
103        | 4 (minutes)

Итак, здесь я хочу вычислить разницу во времени «созданного» поля для данных, которые сгруппированы по session_id.

Любая помощь будет великолепна. Заранее спасибо:)

Моя ситуация:

У меня есть таблица со следующими полями:

id, session_id, platform, event, created

есть 2 события (Start,End)

Теперь, если есть записи начала и конца для одного и того же session_id, я хочу, чтобы время заняло эту сессию.

Но если у меня есть 2 Начать сеанс, но только 1 Завершить сеанс, тогда я не хочу разницу во времени для 2-го сеанса, потому что она не закончилась

Ответы [ 3 ]

0 голосов
/ 03 мая 2018

Вы можете попробовать его синтаксис:

    WITH cte AS (
    SELECT
        session_id,
        DATEDIFF(minute, created, LAG(created, 1)) AS diff,
        ROW_NUMBER() OVER (PARTITION BY session_id ORDER BY created) rn
    FROM yourTable
)

SELECT

        session_id,
        diff AS time_count
    FROM cte
    WHERE rn % 2 = 0

;
0 голосов
/ 03 мая 2018

Попробуйте это:

Схема таблицы:

CREATE TABLE A(id INT, session_id INT,Event VARCHAR(20), created DATETIME);

INSERT INTO A VALUES(1, 101,'Start','2010/10/01 9:30:10')
,(2, 102,'Start'  , '2010/10/01 9:31:10')
,(3, 101,'End'    , '2010/10/01 9:32:10')
,(4, 103,'Start'  , '2010/10/01 9:35:10')
,(5, 102,'End'    , '2010/10/01 9:38:10')
,(6, 103,'End'    , '2010/10/01 9:39:10')
,(7, 101,'Start'  , '2010/10/01 9:39:10')
,(8, 102,'Start'  , '2010/10/01 9:39:10')
,(9, 101,'End'    , '2010/10/01 9:55:10');

Запрос:

SELECT D.session_id
    ,TIMESTAMPDIFF(MINUTE,MIN(D.created), MAX(D.created)) time_count
FROM(
  SELECT a.id,a.session_id,a.created
    ,ROUND(count(*)/2,0) as RN 
    ,count(*) as row_number1 
  FROM a AS a
  JOIN a AS b ON a.session_id = b.session_id AND a.id >= b.id
  GROUP BY a.id,a.session_id,a.created
  ORDER BY 2,3
    )D
GROUP BY D.session_id,D.RN
HAVING COUNT(1)>1

Выход:

session_id  time_count
101         2
102         7
103         4
101         16

Fiddle:

Проверьте вывод в # SQL Fiddle

0 голосов
/ 03 мая 2018
SELECT session_id,
DATEDIFF(MINUTE, MAX(created), MIN(created)) AS diff
FROM table
GROUP BY session_id
...