Здравствуйте! Сегодня: Чт, 29 Окт 2020, Ваш IP: 34.236.245.255 Войти через loginza
 
Вход | Регистрация | Забыли пароль?
Мой Kbyte.Ru
> Список форумов Kbyte.Ru - - Базы данных
+ Создать новую тему Страница: 1
Тема: Over (sql) · +  +  дата добавления: 16.04.2013 / 10:35
Автор темы:
rusiko
rusiko
тем: 104 / ответов: 25 / благодарностей: 0 / репутация: 3
ответов: 25
создал(а) тем: 104


Привет. Скажите пожайлуста для чего применяется "over" в sql server 2008. Опять я тут в интернете нашел кучу статей насчет этого, но как всегда они все объясняют одинаково. Пожайлуста, если можно объясните своими словами. Спасибо большое.
Технологии: Microsoft SQL Server
 
Ответ # 1 # · +  +  · в избранномx1 дата добавления: 16.04.2013 / 11:23
Автор ответа:
Алексей Немиро
Алексей Немиро
тем: 534 / ответов: 5130 / благодарностей: 325 / репутация: 211
Чашка Kbyte.Ru>>
Url: aleksey.nemiro.ru
Icq: 261779681
Skype: alekseynemiro
ответов: 5130
создал(а) тем: 534


OVER позволяет проводить некоторые расчеты/операции по полям, во многом позволяет заменить вложенные запросы.

Например:
DECLARE @example TABLE (id int identity primary key, name nvarchar(100), zarplata money)

INSERT INTO @example (name, zarplata) VALUES ('Вася', 100);
INSERT INTO @example (name, zarplata) VALUES ('Петя', 120);
INSERT INTO @example (name, zarplata) VALUES ('Маша', 50);
INSERT INTO @example (name, zarplata) VALUES ('Федя', 115);
INSERT INTO @example (name, zarplata) VALUES ('Света', 30);
INSERT INTO @example (name, zarplata) VALUES ('Вася', 200);
INSERT INTO @example (name, zarplata) VALUES ('Вася', 90);
INSERT INTO @example (name, zarplata) VALUES ('Петя', 180);
INSERT INTO @example (name, zarplata) VALUES ('Петя', 210);
INSERT INTO @example (name, zarplata) VALUES ('Вася', 100);
INSERT INTO @example (name, zarplata) VALUES ('Вася', 100);
INSERT INTO @example (name, zarplata) VALUES ('Маша', 30);
INSERT INTO @example (name, zarplata) VALUES ('Маша', 75);
INSERT INTO @example (name, zarplata) VALUES ('Света', 45);
INSERT INTO @example (name, zarplata) VALUES ('Света', 45);
INSERT INTO @example (name, zarplata) VALUES ('Света', 45);
INSERT INTO @example (name, zarplata) VALUES ('Света', 35);

-- выводим вложенным запросом количество записей для конкретного name
SELECT *, 
(SELECT COUNT(id) FROM @example WHERE name = a.name) AS 'количество записей'
FROM @example AS a;

-- выводим при помощи OVER количество записей для конкретного name
SELECT *,
COUNT(id) OVER(PARTITION BY name) AS 'количество записей'
FROM @example;
Если верить документации, то OVER будет работать быстрее, чем вложенный запрос.

Еще в T-SQL есть замечательная функция ROW_NUMBER, которая позволяет получить номер строки выборки, которую можно использовать только с инструкцией OVER:
SELECT ROW_NUMBER() OVER(PARTITION BY name ORDER BY name ASC) AS 'номер строки', *
FROM @example;
Это лишь микроскопическая часть применения OVER.

В SQL Server 2012 возможностей больше.
 
Страница: 1 + Создать новую тему