Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
 Re: Сортировка и группировка  [new]
dandare
Member

Откуда:
Сообщений: 34
Кстати, не понял почему надо 3 символа вырезать из времени в моем первом запросе?
По-идее час занимает 2 цифры по-формату. Указываю 2 и один символ не захватывает из часа, указываю 4 и вырезается с двоеточием после часа.
20 дек 13, 15:08    [15323732]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и группировка  [new]
Glory
Member

Откуда:
Сообщений: 104760
o-o
ну и?
чем же тогда обосновать применение apply,

Тем, что не надо объявлять переменные, писать два запроса и тд
20 дек 13, 15:09    [15323739]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и группировка  [new]
o-o
Guest
dandare
Кстати, не понял почему надо 3 символа вырезать из времени в моем первом запросе?
По-идее час занимает 2 цифры по-формату. Указываю 2 и один символ не захватывает из часа, указываю 4 и вырезается с двоеточием после часа.


потому что не с 0-ого символа надо брать в строке, а с 1-ого
select SUBSTRING(CONVERT(varchar(30), getdate(), 114), 1, 2)
20 дек 13, 15:11    [15323754]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и группировка  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
o-o
чем же тогда обосновать применение apply,
если, пардон, всего 1 значение на весь запрос требуется?
можно ище и вместо INNER JOIN писать CROSS APPLY, и тот же результат получить, но ЗАЧЕМ?

Я использую для однократного вычисления по формулам.
В плане выполнения такие (формульные) CROSS APPLY эквивалентны прямому вычислению формулы в нужном месте, но позволяют визуально разгрузить списки в SELECT и WHERE.
На производительность такие конструкции практически не влияют.
20 дек 13, 15:12    [15323758]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и группировка  [new]
dandare
Member

Откуда:
Сообщений: 34
o-o
select SUBSTRING(CONVERT(varchar(30), getdate(), 114), 1, 2)


Спасибо.
20 дек 13, 15:12    [15323764]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и группировка  [new]
dandare
Member

Откуда:
Сообщений: 34
Уточнил. Последний час это, это час из самой поздней даты в таблице (пусть и не целый).
Т.е. для данных:
10:05
10:45
11:00
11:05
11:10
это будет час с 11:00 до 12:00.

По-любому сначала нужно отфильтровать записи только по последнему часу. Это очевидно для производительности.
Лопатить каждый раз всю таблицу ни к чему.
20 дек 13, 15:20    [15323813]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и группировка  [new]
o-o
Guest
Glory
o-o
ну и?
чем же тогда обосновать применение apply,

Тем, что не надо объявлять переменные, писать два запроса и тд

капец какой-то.
занафига писать APPLY, если не нравится переменную объявлять, ну подставить запрос для ее высчитывания напрямую в WHERE
(как и сделал aleks2).
запросов было и будет 2,
все равно "последний час" высчитать надо.
но зачем apply?
вообще-то его придумали, когда надо для каждой строки что-то свое посчитать.
а тут одно значение для всего фильтра, какой ?
20 дек 13, 15:33    [15323921]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и группировка  [new]
dandare
Member

Откуда:
Сообщений: 34
Получилось так:

SELECT  AVG(sens1), AVG(sens2), AVG(sens3), AVG(sens4), AVG(sens5), AVG(sens6) 
  FROM Dev1_AI 
  WHERE	comp_date between (select DATEADD(hour, (select DATEPART(hour, max(comp_date)) from Dev1_AI), CONVERT(datetime, (select CONVERT(date, max(comp_date)) from Dev1_AI))))
  and (select max(comp_date) from Dev1_AI)


Как теперь сюда эту дату вывести?
20 дек 13, 15:39    [15323951]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и группировка  [new]
aleks2
Guest
Cygapb-007
aleks2
-- от такого коду рука сам тянется к пистолету...
dateadd(HOUR, -1, getdate()) - это не последний час, а час назад, ощутите разницу...

Нельзя потакать глупости тредстартеров.
Он просто нифига не понимает.
20 дек 13, 15:39    [15323954]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и группировка  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
о-о,
остались вопросы про APPLY?
dandare
Получилось так:

SELECT  AVG(sens1), AVG(sens2), AVG(sens3), AVG(sens4), AVG(sens5), AVG(sens6) 
  FROM Dev1_AI 
  WHERE	comp_date between (select DATEADD(hour, (select DATEPART(hour, max(comp_date)) from Dev1_AI), CONVERT(datetime, (select CONVERT(date, max(comp_date)) from Dev1_AI))))
  and (select max(comp_date) from Dev1_AI)


Как теперь сюда эту дату вывести?
20 дек 13, 15:41    [15323969]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и группировка  [new]
aleks2
Guest
dandare
Получилось так:

SELECT  AVG(sens1), AVG(sens2), AVG(sens3), AVG(sens4), AVG(sens5), AVG(sens6) 
  FROM Dev1_AI 
  WHERE	comp_date between (select DATEADD(hour, (select DATEPART(hour, max(comp_date)) from Dev1_AI), CONVERT(datetime, (select CONVERT(date, max(comp_date)) from Dev1_AI))))
  and (select max(comp_date) from Dev1_AI)


Как теперь сюда эту дату вывести?


Как-то так....
SELECT  AVG(sens1), AVG(sens2), AVG(sens3), AVG(sens4), AVG(sens5), AVG(sens6) 
        , (select DATEADD(hour, (select DATEPART(hour, max(comp_date)) from Dev1_AI), CONVERT(datetime, (select CONVERT(date, max(comp_date)) from Dev1_AI))))
  FROM Dev1_AI 
  WHERE	comp_date >= (select DATEADD(hour, (select DATEPART(hour, max(comp_date)) from Dev1_AI), CONVERT(datetime, (select CONVERT(date, max(comp_date)) from Dev1_AI))))
20 дек 13, 15:42    [15323975]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и группировка  [new]
dandare
Member

Откуда:
Сообщений: 34
Да я им вообще никогда не пользовался.
Группировка наверное прокатит. Только в поле для группировки опять эту хреновину с вычислением начала часа вставлять.
20 дек 13, 15:44    [15323983]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и группировка  [new]
aleks2
Guest
Специально для любителей совать APPLY в каждую дырку

;with
X as ( (select DATEADD(hour, (select DATEPART(hour, max(comp_date)) from Dev1_AI), CONVERT(datetime, (select CONVERT(date, max(comp_date)) dt from Dev1_AI)))) )
SELECT  AVG(sens1), AVG(sens2), AVG(sens3), AVG(sens4), AVG(sens5), AVG(sens6) 
        , (select dt from  X)
  FROM Dev1_AI 
  WHERE	comp_date >= (select dt from X)
20 дек 13, 15:46    [15323994]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и группировка  [new]
dandare
Member

Откуда:
Сообщений: 34
aleks2
Как-то так....



Точно! Спасибо! В школу надо опять!
Никаких группировок и apply и переменных.
Красиво, имхо!
Респект Вам!
20 дек 13, 15:47    [15323998]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и группировка  [new]
dandare
Member

Откуда:
Сообщений: 34
aleks2
Специально для любителей совать APPLY в каждую дырку


И за это спасибо! Удобно.
20 дек 13, 15:48    [15324012]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и группировка  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
какой то пунтик к apply прямо таки. Ведь визуальнее меньше места и семантически понятнее. Ну дык пишите как хотите.
20 дек 13, 15:51    [15324032]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и группировка  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
aleks2
Специально для любителей совать APPLY в каждую дырку

;with
X as ( (select DATEADD(hour, (select DATEPART(hour, max(comp_date)) from Dev1_AI), CONVERT(datetime, (select CONVERT(date, max(comp_date)) dt from Dev1_AI)))) )
SELECT  AVG(sens1), AVG(sens2), AVG(sens3), AVG(sens4), AVG(sens5), AVG(sens6) 
        , (select dt from  X)
  FROM Dev1_AI 
  WHERE	comp_date >= (select dt from X)
ага, СТЕ еще пихать... курасива...
SELECT c.last_hour, COUNT(*) qty, AVG(d.sens1) sens1, AVG(d.sens2) sens2
FROM (
  SELECT DATEADD(HOUR, DATEPART(HOUR, MAX(comp_date)), CONVERT(DATETIME, CONVERT(DATE, MAX(comp_date))))
  FROM Dev1_AI
  ) c(last_hour)
JOIN Dev1_AI d ON d.comp_date >= c.last_hour
GROUP BY c.last_hour

И что интересно, с точки зрения оптимизатора - монопенисуально никакой разницы
20 дек 13, 15:53    [15324049]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и группировка  [new]
dandare
Member

Откуда:
Сообщений: 34
Мистер Хенки
какой то пунтик к apply прямо таки. Ведь визуальнее меньше места и семантически понятнее. Ну дык пишите как хотите.


Что касаемо меня, то я им просто не пользовался никогда - тупо не умею. Неприязни к нему нет. )
20 дек 13, 15:57    [15324084]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и группировка  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
dandare
Мистер Хенки
какой то пунтик к apply прямо таки. Ведь визуальнее меньше места и семантически понятнее. Ну дык пишите как хотите.


Что касаемо меня, то я им просто не пользовался никогда - тупо не умею. Неприязни к нему нет. )

Ну надо из разных позиций уметь зубы удалять
20 дек 13, 16:07    [15324126]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и группировка  [new]
dandare
Member

Откуда:
Сообщений: 34
Мистер Хенки,

Согласен.
20 дек 13, 16:17    [15324175]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и группировка  [new]
prog882
Guest
dandare,

select cdt=dateadd(hour,t.mxhr,t.mxdtst),avg(t.sens1),....,avg(t.sens(n))
from (
select comp_date,sens1,.....,sens(n),
mxdt=max(comp_date) over(), 
mxhr=max(datepart(hour,comp_date)) over(partition by convert(date,comp_date)),
mxdtst=max(convert(datetime,convert(date,comp_date))) over()
from Dev1_AI ) t
where t.comp_date >= dateadd(hour,t.mxhr,t.mxdtst)
group by dateadd(hour,t.mxhr,t.mxdtst)
20 дек 13, 16:20    [15324194]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и группировка  [new]
o-o
Guest
мы тут с Cygapb-007 вернулись к старой теме.
Cygapb-007 требует ответ по сути.
ок, я за свои слова отвечу:
o-o
зачем вообще apply, если можно посчитать 1 раз этот "последний час" в переменную @dt
и потом фильтровать уже сам запрос на comp_date >= @dt?


declare @dt datetime = (select convert(char(14),max(date), 120) + '00:00' from dbo.Pass_in_trip)

select @dt, avg(id_psg) 
from dbo.pass_in_trip 
where	date >= @dt

----------------------------------------- 
SELECT c.last_hour, avg(id_psg) 
FROM (SELECT MAX(date) FROM dbo.pass_in_trip) t(last_date)
CROSS APPLY (
  SELECT DATEADD(HOUR, DATEPART(HOUR, t.last_date), CONVERT(DATETIME, CONVERT(DATE, t.last_date)))
  ) c(last_hour)
JOIN dbo.pass_in_trip d ON d.date >= c.last_hour
GROUP BY c.last_hour


не буду снова повторять о перенесении в WHERE запроса для высчитывания "последнего часа"
для тех, кому влом объявить переменную.
а теперь приведу сюда же из соседнего топика:
Cygapb-007
o-o,

да я разве против?

нравятся вам длинные трудночитаемые формулы в запросах - ну и на здоровье, вам их и поддерживать, в конце концов


если по-Вашему мой запрос и вправду "трудночитаемый" и "ужас-как-сложно-поддерживаемый" по сравнению с Вашим, то я ПАС.

+
запрос переделан под небезызвестную Вам базу aero,
если хочется поэкспериментировать,
добавьте временнУю часть в dbo.Pass_in_trip.date:
update dbo.Pass_in_trip
set date = date + cast(getdate() as time)
21 дек 13, 15:47    [15327642]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и группировка  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
o-o
мы тут с Cygapb-007 вернулись к старой теме.
Cygapb-007 требует ответ по сути.
ок, я за свои слова отвечу:
o-o
зачем вообще apply, если можно посчитать 1 раз этот "последний час" в переменную @dt
и потом фильтровать уже сам запрос на comp_date >= @dt?


declare @dt datetime = (select convert(char(14),max(date), 120) + '00:00' from dbo.Pass_in_trip)

select @dt, avg(id_psg) 
from dbo.pass_in_trip 
where	date >= @dt

----------------------------------------- 
SELECT c.last_hour, avg(id_psg) 
FROM (SELECT MAX(date) FROM dbo.pass_in_trip) t(last_date)
CROSS APPLY (
  SELECT DATEADD(HOUR, DATEPART(HOUR, t.last_date), CONVERT(DATETIME, CONVERT(DATE, t.last_date)))
  ) c(last_hour)
JOIN dbo.pass_in_trip d ON d.date >= c.last_hour
GROUP BY c.last_hour


не буду снова повторять о перенесении в WHERE запроса для высчитывания "последнего часа"
для тех, кому влом объявить переменную.
а теперь приведу сюда же из соседнего топика:
Cygapb-007
o-o,

да я разве против?

нравятся вам длинные трудночитаемые формулы в запросах - ну и на здоровье, вам их и поддерживать, в конце концов


если по-Вашему мой запрос и вправду "трудночитаемый" и "ужас-как-сложно-поддерживаемый" по сравнению с Вашим, то я ПАС.

+
запрос переделан под небезызвестную Вам базу aero,
если хочется поэкспериментировать,
добавьте временнУю часть в dbo.Pass_in_trip.date:
update dbo.Pass_in_trip
set date = date + cast(getdate() as time)
от же ж репейник якой...
Нияк ни хотит дуализму признавать

Я что говорю - серверу по барабану, что с него спрашивают, ему бы поменьша своих ресурсов на наши глупости тратить, и ладненько

А если юзерей не напрягает ни время обработки, ни получаемый ризультат, то и хрен (растениё такое) бы с ними вместе вырос

А чтоб более предметно спорить - надо икс-пиременты проводить, с тистированием разной статистики на разных абъёмах - оно вам надоть?

Я что говорил - найти максимальное значение это раз, преобразовать його в дату-время крайниго часу - это два, атабрать все данные позжее ентого часу - это три, посчитать средние значения среди отобраннаго - ето читыре
Реализовать сиё придложил пасредством сего запроса: Сортировка и группировка, да вы его собственно и продублировали в цитате, да и ваш вариант делает то же самое, тока в два запроса..

И тута вдрух посыпались абвинения в никашерности кода...
Ну не нравится вам код с CROSS APPLY - ну не юзайте его, не вам предложено было, так нет, упёрлися рогом (жене привет),
начали припираться не по сути, нет бы дать конкретную statistics io, time on/off на варианты - не, это не ваш путь, вам поспамить - и хлеба не нать...

Да и (предположительно) ваша уверенность, что с использованием переменных не требуется группировка - ... как бы сказать... умиляет

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

PS за стиль сорь, прошу учесть субботнее настроение%)
21 дек 13, 19:25    [15328028]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и группировка  [new]
o-o
Guest
1. сам репейник
2. нефиг мне приписывать "не мое".
не было у меня ни про некошерность, ни про "что быстрее".
что у меня "трудночитаемо", опять же, Ваше (еще не видя кода обкакал).
и про агрегаты -- тоже Ваши фантазии.
где у меня сказано хоть что-то про агрегацию?
говорю, Ваши группировки "этажность" коду добавили, да,
именно Вам, обвинителю других в "нечитаемости" и загроможденности кода.
3. aleks2 -- хамло известное, но его код всегда четкий и минимальный.
и когда бы еще по производительности кому проигрывал.
a про "засовывателей APPLY-я" он высказался, простите, грубо, но метко.
посему исход эксперимента, можно сказать, был предопределен,
из вас двоих мои ставки на aleks2

эксперименты и статистикa?
неа, мне нелениво, пжалста.
надеюсь, на этом отцепитесь.
(аж из другой темы зацепил, надо же.
только за то, что ему указали, что влепил APPLY туда, где и без него неплохо)

на 9.961.472 строках, чтоб не мелочиться

set statistics io on
set statistics time on

print '--------------o-o-----------------'
declare @dt datetime = (select convert(char(14),max(date), 120) + '00:00' from dbo.Pass_in_trip)

select @dt, avg(id_psg) 
from dbo.pass_in_trip 
where	date >= @dt

----------------------------------------- 
print '-----------Cygapb-007--------------'

SELECT c.last_hour, avg(id_psg) 
FROM (SELECT MAX(date) FROM dbo.pass_in_trip) t(last_date)
CROSS APPLY (
  SELECT DATEADD(HOUR, DATEPART(HOUR, t.last_date), CONVERT(DATETIME, CONVERT(DATE, t.last_date)))
  ) c(last_hour)
JOIN dbo.pass_in_trip d ON d.date >= c.last_hour
GROUP BY c.last_hour


SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
>>>--------------o-o-----------------<<<

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
Table 'Pass_in_trip'. Scan count 5, logical reads 45018, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

(1 row(s) affected)

SQL Server Execution Times:
CPU time = 3355 ms, elapsed time = 943 ms.

(1 row(s) affected)
Table 'Pass_in_trip'. Scan count 5, logical reads 45018, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

(1 row(s) affected)

SQL Server Execution Times:
CPU time = 890 ms, elapsed time = 311 ms.
>>>-----------Cygapb-007--------------<<<

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.

(1 row(s) affected)
Table 'Pass_in_trip'. Scan count 10, logical reads 89832, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

(1 row(s) affected)

SQL Server Execution Times:
CPU time = 8144 ms, elapsed time = 2490 ms.
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.

SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.

-------------------------------------------------
табличка у Вас есть, заполните данными (если еще не сделали для sql-ex) и проверьте сами
-------------------------------------------------
Cygapb-007, мир-дружба?
могу еще и выданный мне приз за репейничество на память подарить.
можем даже распилить его на двоих, вроде как оба хороши
21 дек 13, 23:01    [15328681]     Ответить | Цитировать Сообщить модератору
 Re: Сортировка и группировка  [new]
o-o
Guest
фу, цветом не выделилось.
короче, где вывод принта с нашими никами, стрелочки -- это не "фальсификация" вывода,
это было задумано сделать красным, тока надо было в код помещать, а не снаружи
21 дек 13, 23:05    [15328690]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить