Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Отбор максимального по дате значения из группы  [new]
LisSp
Member

Откуда:
Сообщений: 186
Добрый день!
У кого найдётся время и возможность, посмотрите, пожалуйста, мой скрипт. Он делает всё, что мне нужно в итоге. Но этот способ по времени ужасно долго выполняется. Наверное, есть у Sql Server лучшее решение. Подскажите его, пожалуйста.
Задача такая: есть повторяющиеся значения в столбце STL1, но с разной датой в столбце STL2. Надо отобрать самые максимальные значения по дате для каждого значения в STL1.


DECLARE @TABL TABLE (STL1 NVARCHAR(35), STL2 DATETIME)
INSERT INTO @TABL
SELECT 'ZAKAZ1','2015-06-18'
UNION ALL 
SELECT 'ZAKAZ1','2016-02-12'
UNION ALL 
SELECT 'ZAKAZ2','2015-01-12'
UNION ALL 
SELECT 'ZAKAZ2','2016-02-11'

--SELECT *
--FROM @TABL

DECLARE @TABL1 TABLE (I INT IDENTITY, STL1 NVARCHAR(35))
INSERT INTO @TABL1
SELECT STL1
FROM @TABL
GROUP BY STL1

--SELECT *
--FROM @TABL1

DECLARE @TABL2 TABLE (I INT, STL1 NVARCHAR(35), STL2 DATETIME)
INSERT INTO @TABL2
SELECT I, A.STL1, STL2
FROM @TABL A LEFT JOIN @TABL1 B ON A.STL1=B.STL1

--SELECT *
--FROM @TABL2


DECLARE @TABL3 TABLE ( STL1 NVARCHAR(35), STL2 DATETIME )
INSERT INTO @TABL3
SELECT STL1, STL2
FROM (
   SELECT 
      ROW_NUMBER() OVER(partition BY I ORDER BY STL1 ASC, STL2 DESC) RowNum,
      *
   FROM @TABL2
   ) t
WHERE t.RowNum = 1

SELECT *
FROM @TABL3
12 фев 16, 11:01    [18807843]     Ответить | Цитировать Сообщить модератору
 Re: Отбор максимального по дате значения из группы  [new]
Glory
Member

Откуда:
Сообщений: 104760
LisSp
Но этот способ по времени ужасно долго выполняется.

И время выполнения какой именно из команд вашего скрипта вам больше всего не нравится ?
И какой план выполнения у этой команды ?
12 фев 16, 11:05    [18807876]     Ответить | Цитировать Сообщить модератору
 Re: Отбор максимального по дате значения из группы  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
LisSp,

select STL1, max(STL2)
from @TABL
group by STL1


Такое вы хотите получить?
12 фев 16, 11:09    [18807901]     Ответить | Цитировать Сообщить модератору
 Re: Отбор максимального по дате значения из группы  [new]
LisSp
Member

Откуда:
Сообщений: 186
Glory
И время выполнения какой именно из команд вашего скрипта вам больше всего не нравится ?
И какой план выполнения у этой команды ?


Время выполнения команды объявления @TABL2 не нравится. На этом примере не заметно, конечно. А в жизни минуту выполняется, т.к. изначально работа идёт с огромными таблицами.
Как оно в жизни и есть-план этого прикладываю.

К сообщению приложен файл. Размер - 28Kb
12 фев 16, 11:15    [18807940]     Ответить | Цитировать Сообщить модератору
 Re: Отбор максимального по дате значения из группы  [new]
Glory
Member

Откуда:
Сообщений: 104760
LisSp
Как оно в жизни и есть-план этого прикладываю.

Картинка с другого сайта.

Это не план команды объявления @TABL2
Это план какого insert-а в @TABL2
12 фев 16, 11:19    [18807975]     Ответить | Цитировать Сообщить модератору
 Re: Отбор максимального по дате значения из группы  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
LisSp,

и индексов никаких нет. Для четырёх-то строк ладно. Но по жизни-то данных больше?
12 фев 16, 11:19    [18807976]     Ответить | Цитировать Сообщить модератору
 Re: Отбор максимального по дате значения из группы  [new]
LisSp
Member

Откуда:
Сообщений: 186
Minamoto
LisSp,

select STL1, max(STL2)
from @TABL
group by STL1


Такое вы хотите получить?


Ну выглядеть данные так должны да. Но это решение не подходит, т.к. в жизни там ещё есть столбцы с данными и отобрать только исключительно строки по одному STL1 с максимальной датой так не получится.
12 фев 16, 11:20    [18807979]     Ответить | Цитировать Сообщить модератору
 Re: Отбор максимального по дате значения из группы  [new]
LisSp
Member

Откуда:
Сообщений: 186
iap
LisSp,

и индексов никаких нет. Для четырёх-то строк ладно. Но по жизни-то данных больше?

Да, намного больше. И индексы есть в жизни.
12 фев 16, 11:21    [18807987]     Ответить | Цитировать Сообщить модератору
 Re: Отбор максимального по дате значения из группы  [new]
Glory
Member

Откуда:
Сообщений: 104760
LisSp
Да, намного больше.

И вы хотите, чтобы многомиллионная таблица вся пронумеравалсь очень быстро ?
12 фев 16, 11:22    [18807994]     Ответить | Цитировать Сообщить модератору
 Re: Отбор максимального по дате значения из группы  [new]
LisSp
Member

Откуда:
Сообщений: 186
Glory
LisSp
Да, намного больше.

И вы хотите, чтобы многомиллионная таблица вся пронумеравалсь очень быстро ?

Мне вообще изначально просто интересно- есть ли ещё какой вариант. И была надежда, что другой вариант хоть на секундочку побыстрее будет.
12 фев 16, 11:24    [18808003]     Ответить | Цитировать Сообщить модератору
 Re: Отбор максимального по дате значения из группы  [new]
Glory
Member

Откуда:
Сообщений: 104760
LisSp
Мне вообще изначально просто интересно- есть ли ещё какой вариант. И была надежда, что другой вариант хоть на секундочку побыстрее будет.

Вы серьезно считаете, что есть волшебные команды, которые могут медленный алгоритм сделать быстрым ?
Вам предложили решение, но вы тут же ввели дополнительные, "типа реальные" условия
12 фев 16, 11:30    [18808050]     Ответить | Цитировать Сообщить модератору
 Re: Отбор максимального по дате значения из группы  [new]
LisSp
Member

Откуда:
Сообщений: 186
Glory
LisSp
Мне вообще изначально просто интересно- есть ли ещё какой вариант. И была надежда, что другой вариант хоть на секундочку побыстрее будет.

Вы серьезно считаете, что есть волшебные команды, которые могут медленный алгоритм сделать быстрым ?
Вам предложили решение, но вы тут же ввели дополнительные, "типа реальные" условия

С чего вы взяли, что я ищу волшебные команды? Иногда у одной задачи есть несколько вариантов решения. Один вариант мне показали. Спасибо. Но может есть ещё?
12 фев 16, 11:37    [18808077]     Ответить | Цитировать Сообщить модератору
 Re: Отбор максимального по дате значения из группы  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Простая задача
12 фев 16, 11:43    [18808120]     Ответить | Цитировать Сообщить модератору
 Re: Отбор максимального по дате значения из группы  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
LisSp
Minamoto
LisSp,

select STL1, max(STL2)
from @TABL
group by STL1


Такое вы хотите получить?


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

Тогда описывайте задачу полностью, а не сокращайте ее. Вы по незнанию из постановки задачи убрали важный нюанс, который определяет способ решения.

Если "в жизни там еще столбцы с данными", то ваш способ достаточно эффективен, одного не пойму - а зачем вы там две лишних временных таблицы создаете.

Чем не подходит вариант выбора напрямую:
SELECT STL1, STL2, <другие столбцы>
FROM (
   SELECT 
      ROW_NUMBER() OVER(partition BY STL1 ORDER BY STL2 DESC) RowNum,
      *
   FROM @TABL
) as t
where RowNum = 1
12 фев 16, 11:46    [18808139]     Ответить | Цитировать Сообщить модератору
 Re: Отбор максимального по дате значения из группы  [new]
o-o
Guest
LisSp
Minamoto
LisSp,

select STL1, max(STL2)
from @TABL
group by STL1


Такое вы хотите получить?


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

вас только спросили, строки с этим ли надо получить.
чтобы остальные поля тоже были,
разумеется к этому всему надо проджойнить исходную таблицу.
и это хороший вариант, когда нужных строк мало,
а для каждой группы строк много.
соответственно, полный вариант выглядит так:
во временную таблицу кладете результат этой выборки:
select STL1, max(STL2)
from @TABL
group by STL1


ну а потом джойните(inner) времянку с исходной таблицей.
----
а индекс-то есть по (STL1, STL2)?
12 фев 16, 11:47    [18808149]     Ответить | Цитировать Сообщить модератору
 Re: Отбор максимального по дате значения из группы  [new]
mishanya3624
Member

Откуда:
Сообщений: 795
o-o,

говорит, что есть
12 фев 16, 11:50    [18808171]     Ответить | Цитировать Сообщить модератору
 Re: Отбор максимального по дате значения из группы  [new]
o-o
Guest
mishanya3624
o-o,

говорит, что есть

она говорит, "индексы есть".
а какие, не говорит.
есть же любители насоздавать просто одноколоночные индексы на каждый столбец,
и что мне или запросу с этого?
я про конкретный индекс спрашиваю
12 фев 16, 12:06    [18808261]     Ответить | Цитировать Сообщить модератору
 Re: Отбор максимального по дате значения из группы  [new]
LisSp
Member

Откуда:
Сообщений: 186
[quot Minamoto]
LisSp
пропущено...

Чем не подходит вариант выбора напрямую:

[/src]

Почему-то до этого у меня не получалось соединить напрямую. А с вашим примером получилось! Этот вариант очень подходит! Время выполнения запроса сократилось с минуты до нескольких секунд! Большое Вам спасибо!!!
12 фев 16, 12:08    [18808278]     Ответить | Цитировать Сообщить модератору
 Re: Отбор максимального по дате значения из группы  [new]
LisSp
Member

Откуда:
Сообщений: 186
o-o

ну а потом джойните(inner) времянку с исходной таблицей.
?

Спасибо за Ваш вариант и потраченное время!
Если джойнить времянку с исходной таблицей, то получается на 9 секунд дольше, чем мой пример.
12 фев 16, 12:10    [18808284]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить