у меня есть набор данных, который выглядит следующим образом:разница Расчет времени между различными записями
Для каждого OwnerID
, я хотел бы, чтобы вычислить разницу в столбце creationtime
для текущей записи и следующая запись (для тех же ownerID
), в виде новой колонки TimeDiff
. Я считаю, что здесь требуется самостоятельное объединение, но я не уверен, как использовать самоподключение для вычисления разницы между текущей записью и следующей записью.
При этом самая последняя запись для любого ownerID
может иметь значение по умолчанию «NA», так как следующей записи не будет (для того же ownerID
), чтобы вычислить разницу.
Вот запрос, который я использовал, чтобы получить этот набор данных:
SELECT DISTINCT ga.ownerid,
mr.name,
SPLIT_PART(SPLIT_PART(ga.activitydata,' ',2),',',1) AS Assignmentid,
EXTRACT(YEAR FROM ga.creationtime) AS YEAR,
EXTRACT(MONTH FROM ga.creationtime) AS MONTH,
EXTRACT(DAY FROM ga.creationtime) AS DAY,
EXTRACT(DOW FROM ga.creationtime) AS DOW,
ga.creationtime,
a.encodedid,
a.name
FROM flx2.groupactivities ga
JOIN flx2.memberstudytrackitemstatus mstis ON SPLIT_PART (SPLIT_PART (ga.activitydata,' ',2),',',1) = mstis.assignmentid
JOIN flx2.artifacts a ON mstis.studytrackitemid = a.id
JOIN auth.memberhasroles mhr ON mhr.memberid = ga.ownerid
JOIN flx2.memberroles mr ON mr.id = mhr.roleid
WHERE ga.activitytype = 'assign'
AND ga.ownerid NOT IN (SELECT memberid FROM auth.memberhasroles WHERE roleid = 25)
AND a.artifacttypeid = 54
AND a.encodedid IS NOT NULL
ORDER BY ga.ownerid,
ga.creationtime,
a.encodedid
Я использую Amazon Redshift
, чтобы получить эти данные.
Любая помощь будет оценена по достоинству.
TIA!
UPDATE:
Я использовал метод, предложенный @systemjack. Вот результаты, которые я получаю:
Мы можем ясно заметить здесь, что колонна encodedid
становится повторяется для того же assignmentID
(MAT.PRB.410
, как подчеркивается в изображении выше), который не должен быть дело. Это не происходило без функции LEAD
в запросе, упомянутом выше. Вот обновленный запрос, который я использую (только имеет дополнительную функцию LEAD
):
SELECT DISTINCT ga.ownerid,
mr.name,
SPLIT_PART(SPLIT_PART(ga.activitydata,' ',2),',',1) AS Assignmentid,
EXTRACT(YEAR FROM ga.creationtime) AS YEAR,
EXTRACT(MONTH FROM ga.creationtime) AS MONTH,
EXTRACT(DAY FROM ga.creationtime) AS DAY,
EXTRACT(DOW FROM ga.creationtime) AS DOW,
ga.creationtime,
LEAD(ga.creationtime,1) OVER (PARTITION BY ga.ownerid ORDER BY ga.creationtime) AS nexttime,
a.encodedid,
a.name
FROM flx2.groupactivities ga
JOIN flx2.memberstudytrackitemstatus mstis ON SPLIT_PART (SPLIT_PART (ga.activitydata,' ',2),',',1) = mstis.assignmentid
JOIN flx2.artifacts a ON mstis.studytrackitemid = a.id
JOIN auth.memberhasroles mhr ON mhr.memberid = ga.ownerid
JOIN flx2.memberroles mr ON mr.id = mhr.roleid
WHERE ga.activitytype = 'assign'
AND ga.ownerid NOT IN (SELECT memberid FROM auth.memberhasroles WHERE roleid = 25)
AND a.artifacttypeid = 54
AND a.encodedid IS NOT NULL
ORDER BY ga.ownerid,
ga.creationtime,
a.encodedid LIMIT 1000
Значения в колонке nexttime
также, кажется, измученный. Кажется, что следующее значение в столбце creationtime
на ocassion. Например: во 2-й записи значение nexttime
должно быть 2013-09-18 06:14:59
вместо 2014-01-18 12:16:49
Почему мы получаем больше записей, чем ожидалось? Как исправить эти проблемы?
вы можете изменить таблицу и добавить еще один столбец? – DCR
Я получаю эти данные, используя запрос, который я опубликовал в вопросе. Так что это набор результатов, а не сама таблица. Если вы попросите добавить столбец в любую из 'flx2.groupactivities',' flx2.memberstudytrackitemstatus', 'flx2.artifacts',' auth.memberhasroles', 'flx2.memberroles', тогда это невозможно. – Patthebug
В случае 'encodeid' вы должны получать повторяющиеся строки из одного из соединений. Глобальный DISTINCT скрывает, что, когда у вас нет LEAD, который делает две записи отличными, поскольку один получает свое преимущество от дубликата, а второй получает его от фактической следующей записи. В результате они выходят из строя, потому что «порядок» не включает в себя следующее время, и они имеют одинаковые другие значения, поэтому они произвольны. Я бы рекомендовал разделить ваш базовый запрос ... может вставить его в предложение WITH или подвыбор и применить LEAD и любую агрегацию после того, как DISTINCT будет эффективен. – systemjack