Переменные также можно использовать для замены аналитических функций. Далее несколько примеров. Для простоты будем считать, что все поля NOT NULL, а сортировка и партиционирование (PARTITION BY) происходят по одному полю. Использование NULL значений и более сложных сортировок сделает примеры более громоздкими, но суть не поменяет.
Для примеров создадим таблицу TestTable:
CREATETABLE TestTable(
group_id INT NOTNULL,
order_id INT UNIQUENOTNULL,
value INT NOTNULL
);
где
group_id – идентификатор группы (аналог окна аналитической функции);
order_id – уникальное поле, по которому будет производиться сортировка;
value – некоторое числовое значение.
Заполним нашу таблицу тестовыми данными:
INSERT TestTable(order_id, group_id, value)
SELECT *
FROM(
SELECT1 order_id, 1 group_id, 1 value
UNIONALLSELECT2, 1, 2
UNIONALLSELECT3, 1, 2
UNIONALLSELECT4, 2, 1
UNIONALLSELECT5, 2, 2
UNIONALLSELECT6, 2, 3
UNIONALLSELECT7, 3, 1
UNIONALLSELECT8, 3, 2
UNIONALLSELECT9, 4, 1
UNIONALLSELECT11, 3, 2
)T;
Примеры замены некоторых аналитических функций.
1) ROW_NUMBER() OVER(ORDER BY order_id)
SELECT T.*, @I:=@I+1 RowNum
FROM TestTable T,(SELECT @I:=0)I
ORDERBY order_id;
group_id
order_id
value
RowNum
1
1
1
1
1
2
2
2
1
3
2
3
2
4
1
4
2
5
2
5
2
6
3
6
3
7
1
7
3
8
2
8
4
9
1
9
3
11
2
10
2) ROW_NUMBER() OVER(PARTITION BY group_id ORDER BY order_id)