|
|
|
top n в подзапросе
|
|||
|---|---|---|---|
|
#18+
Добрый день! Sybase ASE/12.5.4 Дано: две таблицы. В одной (#a1) перечислены сущности, в другой (#a2) - значение какого-либо параметра для каждой сущности на дату. Необходимо определить последнее значение параметра для каждой сущности. Как это сделать в Sybase без использования TOP n в подзапросах? Тестовые данные: Код: plaintext 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2010, 16:50 |
|
||
|
top n в подзапросе
|
|||
|---|---|---|---|
|
#18+
LelikB, А что значит последнее? Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2010, 17:24 |
|
||
|
top n в подзапросе
|
|||
|---|---|---|---|
|
#18+
amakhin, Предположим, что в таблице #a2 есть идентификатор, т.е. если на дату задано два параметра, то нужно брать параметр с максимальным ID. Код: plaintext 1. 2. 3. 4. 5. 6. В MSSQL такая задача может быть решена примерно так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2010, 17:43 |
|
||
|
top n в подзапросе
|
|||
|---|---|---|---|
|
#18+
LelikB, Код: plaintext 1. 2. 3. 4. 5. вот такое получилось. Может можно и изящнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2010, 18:49 |
|
||
|
top n в подзапросе
|
|||
|---|---|---|---|
|
#18+
amakhin, Увы, такой способ не подходит в случае, если нужно выбрать значение с максимальной датой и минимальным ID. Т.е., например, нужно найти значение с максимальной датой. Если на дату задано несколько значений, то нужно выбрать значение с минимальным ID. Для MSSQL достаточно изменить вариант сортировки по ID: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Хотелось бы найти вариант покрасивее, чем этот: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2010, 22:19 |
|
||
|
top n в подзапросе
|
|||
|---|---|---|---|
|
#18+
LelikB, а что мешает сделать так Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2010, 11:13 |
|
||
|
top n в подзапросе
|
|||
|---|---|---|---|
|
#18+
amakhin, Это не совсем корректный вариант. Посмотрите на тестовые данные: для a1_id=1 за 20090104 есть два значения: 2 и 5. Мне нужно взять значение с минимальным id, т.е. 2. Однако Ваш запрос для a1_id=1 возьмет min(id), соответствующий 20090101. Это будет наглядно видно, если изменить тестовые данные за '20090101', например, таким образом: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2010, 13:06 |
|
||
|
top n в подзапросе
|
|||
|---|---|---|---|
|
#18+
LelikB, Вы бы задачу описали нормально. Есть id, которого в данных нет (предполагайте сами), потом нужно определить последнее значение параметра, а потом нужно оказывается брать минимальное id. create table #a2 ( id int, a1_id int, dt smalldatetime, a2_value int) go insert #a2 select 1,1, '20090101', 1 union all select 2,1, '20090102', 1 union all select 3,1, '20090103', 2 union all select 4,1, '20090104', 2 union all select 5,1, '20090104', 5 union all select 6,2, '20090103', 5 union all select 7,5, '20090103', 5 union all select 8,6, '20090103', 5 go select a1_id, min_id, max_id, (select a2_value from #a2 where id=TT.min_id) as first_value, (select a2_value from #a2 where id=TT.max_id) as last_value, convert(varchar,dt,102) FROM ( select a1_id, dt, min(id) as min_id, max(id) as max_id from #a2 t1 where dt=(select max(dt) from #a2 where a1_id=t1.a1_id) group by a1_id, dt ) TT order by 1 go ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2010, 15:03 |
|
||
|
|

start [/forum/topic.php?fid=55&fpage=31&tid=2010774]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
39ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
41ms |
get tp. blocked users: |
2ms |
| others: | 13ms |
| total: | 137ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...