Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
ROW_NUMBER с пропуском строк
|
|||
|---|---|---|---|
|
#18+
Добрый день! Есть таблица Код: sql 1. 2. 3. 4. 5. 6. Необходимо, выбрать с группировкой по prop_id все записи с максимальной date плюс следующую по date запись с type=2(при этом максимальная запись тоже может быть с type=2, тогда надо искать следующую) Сделать надо за один проход, в реальной таблице 200 млн. записей. Как сделать не за один проход я знаю: первым проходом забрать максимальные, вторым проходом забрать максимальные с type=2, которых нет в результатах первого прохода. Ситуация, когда максимальная по дате запись в рамках prop_id не с type=2 решается тривиально: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Но как в этот же проход уместить ситуацию, когда m.rn = 1 AND m.type = 2 и надо найти следующую запись с type = 2 уже час не могу придумать Версия сервера Код: sql 1. 2. Я отстал в развитии T-SQL, кроме ROW_NUMBER, RANK и DENSE_RANK толком ничего не знаю. Может есть новые конструкции языка, которые помогут решить проблему? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2019, 15:24 |
|
||
|
ROW_NUMBER с пропуском строк
|
|||
|---|---|---|---|
|
#18+
Oblom, так вроде ... Код: sql 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2019, 16:02 |
|
||
|
ROW_NUMBER с пропуском строк
|
|||
|---|---|---|---|
|
#18+
fix courtOblom, так вроде ... Код: sql 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2019, 16:08 |
|
||
|
ROW_NUMBER с пропуском строк
|
|||
|---|---|---|---|
|
#18+
courtfix courtOblom, так вроде ... Код: sql 1. 2. 3. 4. 5. нее, всё равно "плохо", если первая/вторая запись с type = 2 будет с rn>2 сори ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2019, 16:35 |
|
||
|
ROW_NUMBER с пропуском строк
|
|||
|---|---|---|---|
|
#18+
OblomСделать надо за один проход А "один проход" это вы как меряете? Oblom Код: sql 1. 2. вы план этого "одного прохода" смотрели? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2019, 16:39 |
|
||
|
ROW_NUMBER с пропуском строк
|
|||
|---|---|---|---|
|
#18+
msLexOblomСделать надо за один проход А "один проход" это вы как меряете? Oblom Код: sql 1. 2. вы план этого "одного прохода" смотрели? Справедливо, там будет не один проход. Но и не два полных скана таблицы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2019, 16:53 |
|
||
|
ROW_NUMBER с пропуском строк
|
|||
|---|---|---|---|
|
#18+
OblommsLexпропущено... А "один проход" это вы как меряете? пропущено... вы план этого "одного прохода" смотрели? Справедливо, там будет не один проход. Но и не два полных скана таблицы Материализуйте нужные данные из 200 миллионной таблицы в # таблицу. Добавьте нужные индексы. Вот вам и "за 1 проход по 200 млн-ой таблице" нужное решение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2019, 17:02 |
|
||
|
ROW_NUMBER с пропуском строк
|
|||
|---|---|---|---|
|
#18+
msLexOblomпропущено... Справедливо, там будет не один проход. Но и не два полных скана таблицы Материализуйте нужные данные из 200 миллионной таблицы в # таблицу. Добавьте нужные индексы. Вот вам и "за 1 проход по 200 млн-ой таблице" нужное решение. Спасибо, этот способ я знаю. Более того, я его в итоге и сделал. Вопрос был в другом, ваш ответ на него "Нет, и вообще вам не это надо". Спасибо, может у кого-то будет положительный ответ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2019, 17:08 |
|
||
|
ROW_NUMBER с пропуском строк
|
|||
|---|---|---|---|
|
#18+
OblommsLexпропущено... Материализуйте нужные данные из 200 миллионной таблицы в # таблицу. Добавьте нужные индексы. Вот вам и "за 1 проход по 200 млн-ой таблице" нужное решение. Спасибо, этот способ я знаю. Более того, я его в итоге и сделал. Вопрос был в другом, ваш ответ на него "Нет, и вообще вам не это надо". Спасибо, может у кого-то будет положительный ответ. А с чего вы решили, что гирлянды row_number-ов с, с той же промежуточной материализацией, в той же tempdb, будут работать быстрее? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2019, 17:21 |
|
||
|
ROW_NUMBER с пропуском строк
|
|||
|---|---|---|---|
|
#18+
msLexOblomпропущено... Спасибо, этот способ я знаю. Более того, я его в итоге и сделал. Вопрос был в другом, ваш ответ на него "Нет, и вообще вам не это надо". Спасибо, может у кого-то будет положительный ответ. А с чего вы решили, что гирлянды row_number-ов с, с той же промежуточной материализацией, в той же tempdb, будут работать быстрее? Ок, переформулирую вопрос: Как решить задачу "гирляндой ROW_NUMBER" без временных таблиц и подзапросов? Вопрос на возможность такой реализации. Если кто-то кинет ссылкой вместо работающего кода - буду благодарен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2019, 21:34 |
|
||
|
ROW_NUMBER с пропуском строк
|
|||
|---|---|---|---|
|
#18+
вторая попытка :) Код: sql 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.07.2019, 08:06 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=39836946&tid=1687553]: |
0ms |
get settings: |
9ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
127ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
62ms |
get tp. blocked users: |
1ms |
| others: | 250ms |
| total: | 484ms |

| 0 / 0 |
