Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Группировка по временному интервалу (1 значение из интервала)
|
|||
|---|---|---|---|
|
#18+
Коллеги, добрый день. Помогите советом. Есть некие события у пользователей, нужно эти события сгруппировать по 20-минутным интервалам и взять 1 значение. Другими словами, если возникло событие, то все последующие по времени в пределах 20 минут по тому же пользователю (userid) нужно отбросить, 1 значение > 20 мин - считать новым интервалом, итд. Пример: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Т.е. Должно получится следующее: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2019, 12:06 |
|
||
|
Группировка по временному интервалу (1 значение из интервала)
|
|||
|---|---|---|---|
|
#18+
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2019, 12:12 |
|
||
|
Группировка по временному интервалу (1 значение из интервала)
|
|||
|---|---|---|---|
|
#18+
Блин, неужели все так просто решалось, я тут начал всякие оконные функции сочинять итд ... Спасибо ! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2019, 12:19 |
|
||
|
Группировка по временному интервалу (1 значение из интервала)
|
|||
|---|---|---|---|
|
#18+
Нет, все-таки я поторопился с выводами по вашему решению, вот для этих данных ответ не верный ... Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2019, 14:38 |
|
||
|
Группировка по временному интервалу (1 значение из интервала)
|
|||
|---|---|---|---|
|
#18+
Dimais, аругемнируйте для понимания как это группирует Код: sql 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2019, 14:43 |
|
||
|
Группировка по временному интервалу (1 значение из интервала)
|
|||
|---|---|---|---|
|
#18+
TaPaK, Если у него время (условно минуты) 1, 25, 43 - то первая группа включает только 1, а вторая 25 и 43. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2019, 14:53 |
|
||
|
Группировка по временному интервалу (1 значение из интервала)
|
|||
|---|---|---|---|
|
#18+
Dimais , задача по сути итерационная. Решайте её с использованием курсора - тогда дело обойдётся однократным сканированием таблицы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2019, 14:54 |
|
||
|
Группировка по временному интервалу (1 значение из интервала)
|
|||
|---|---|---|---|
|
#18+
2 Akina - именно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2019, 14:55 |
|
||
|
Группировка по временному интервалу (1 значение из интервала)
|
|||
|---|---|---|---|
|
#18+
Ну с курсором это понятно, другое дело что курсор на больших объемах не самое лучшее решение ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2019, 14:57 |
|
||
|
Группировка по временному интервалу (1 значение из интервала)
|
|||
|---|---|---|---|
|
#18+
Хотя, наверное, можно и так (схематично): Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2019, 14:58 |
|
||
|
Группировка по временному интервалу (1 значение из интервала)
|
|||
|---|---|---|---|
|
#18+
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. ЗЫ: Нужен будет индекс по (userid, dt) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2019, 16:49 |
|
||
|
Группировка по временному интервалу (1 значение из интервала)
|
|||
|---|---|---|---|
|
#18+
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2019, 23:21 |
|
||
|
Группировка по временному интервалу (1 значение из интервала)
|
|||
|---|---|---|---|
|
#18+
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2019, 01:40 |
|
||
|
Группировка по временному интервалу (1 значение из интервала)
|
|||
|---|---|---|---|
|
#18+
Вы чего, народ, с ума все посходили, что ли? Понагородили, понимаешь. Проще надо быть: Код: sql 1. 2. 3. 4. 5. 6. 7. По уму, в таблице должен быть нормальный первичный ключ, тогда условие Код: sql 1. можно будет переписать на нормальное неравенство PK. Иначе строки будут сами себя исключать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2019, 07:48 |
|
||
|
Группировка по временному интервалу (1 значение из интервала)
|
|||
|---|---|---|---|
|
#18+
Спасибо, всем кто предлагал решения. Но, похоже, вариант Ennor Tiegael самый простой и красивый. ЗЫ Хотя, возможно, я опять поторопился с выводами, сейчас потестирую ... :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2019, 10:45 |
|
||
|
Группировка по временному интервалу (1 значение из интервала)
|
|||
|---|---|---|---|
|
#18+
Вот, я так и знал ... Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. Не верный результат, похоже действительно без рекурсии никак ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2019, 11:41 |
|
||
|
Группировка по временному интервалу (1 значение из интервала)
|
|||
|---|---|---|---|
|
#18+
DimaisНо, похоже, вариант Ennor Tiegael самый простой и красивый.И неправильный, если исходить изDimaisДругими словами, если возникло событие, то все последующие по времени в пределах 20 минут по тому же пользователю (userid) нужно отбросить, 1 значение > 20 мин - считать новым интервалом, итд. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2019, 11:42 |
|
||
|
Группировка по временному интервалу (1 значение из интервала)
|
|||
|---|---|---|---|
|
#18+
2 invm - да вы правы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2019, 11:50 |
|
||
|
Группировка по временному интервалу (1 значение из интервала)
|
|||
|---|---|---|---|
|
#18+
Dimais, попробуйте такой вариант: declare @t as table (userid int, dt datetime2(0)) insert into @t select 1, '2019-07-01 07:03:39' union select 1, '2019-07-01 07:05:12' union select 1, '2019-07-01 07:35:52' union select 2, '2019-07-01 01:01:21' union select 2, '2019-07-01 01:19:37' union select 2, '2019-07-01 04:12:37' union select 2, '2019-07-01 04:15:37' union select 2, '2019-08-12 15:42:31' ;with sel as ( select userid ,dt ,n= ROW_NUMBER() over (partition by userid order by userid) from @t) select userid ,dt from ( select userid ,dt ,n ,IIF( min(n) over (partition by userid) = n ,20 , DATEDIFF(MINUTE, (select dt from sel s where s.userid= sel.userid and s.n = sel.n-1), dt) ) aa from sel ) as d where aa>= 20 order by 1,2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2019, 15:24 |
|
||
|
Группировка по временному интервалу (1 значение из интервала)
|
|||
|---|---|---|---|
|
#18+
2 MaksK не, не верно Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. Должны быть те, значения, которые указаны "комментарием". Я так понял, что все способы без рекурсии не работают, так как начало нового диапазона, определяется всегда относительно предыдущего. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2019, 15:43 |
|
||
|
Группировка по временному интервалу (1 значение из интервала)
|
|||
|---|---|---|---|
|
#18+
DimaisЯ так понял, что все способы без рекурсии не работают, так как начало нового диапазона, определяется всегда относительно предыдущего.Именно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2019, 15:46 |
|
||
|
Группировка по временному интервалу (1 значение из интервала)
|
|||
|---|---|---|---|
|
#18+
2 invm - Спасибо Вам Большое :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2019, 15:51 |
|
||
|
Группировка по временному интервалу (1 значение из интервала)
|
|||
|---|---|---|---|
|
#18+
Dimais, а если так: declare @t as table (userid int, dt datetime2(0)) insert into @t select 1, '2019-07-01 07:00:00' --< union select 1, '2019-07-01 07:19:15' union select 1, '2019-07-01 07:20:01' --< union select 1, '2019-07-01 07:40:01' union select 1, '2019-07-01 07:45:15' --< ;with sel as ( select userid ,dt ,n= ROW_NUMBER() over (partition by userid order by userid) from @t) ,sel_ as ( select *, IIF(min(n) over (partition by userid) = n ,1200 ,DATEDIFF(SECOND, (select dt from sel s where s.userid = ss.userid and s.n = ss.n - 1), dt)) as sec from sel ss ) select userid, dt, aa from ( select userid ,dt ,n ,IIF(min(n) over (partition by userid) = n ,1200 ,DATEDIFF(SECOND, (select max(dt) dt from sel_ s where s.userid = sel.userid and s.n < sel.n and s.sec>= 1200 ), dt)) aa from sel_ sel ) as d where aa >= 1200 order by 1,2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2019, 15:59 |
|
||
|
Группировка по временному интервалу (1 значение из интервала)
|
|||
|---|---|---|---|
|
#18+
2 MaksK нет, вот что должно получится Код: sql 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2019, 16:39 |
|
||
|
Группировка по временному интервалу (1 значение из интервала)
|
|||
|---|---|---|---|
|
#18+
Справедливости ради - таки можно без рекурсии: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2019, 11:47 |
|
||
|
|

start [/forum/topic.php?fid=46&fpage=94&tid=1687481]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
44ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
60ms |
get tp. blocked users: |
4ms |
| others: | 254ms |
| total: | 406ms |

| 0 / 0 |
