- Я предполагаю, что вы хотите порт в Access SQL Server запрос, как это:
SELECT *
,DENSE_RANK() OVER(ORDER BY employee_name, employee_address) AS DenseRank
FROM Employee
.
- Основная идея заключается в создании списка с различными значениями
employee_name & employee_address
, а затем мы генерируем номера строк без пробелов для каждого отдельного набора.На последнем шаге мы создаем JOIN между начальным набором данных (таблица Employee) и последним набором данных (который имеет номера строк для каждого отдельного employee_name & employee_address
кортежа).
Решение 1
Запрос0
CREATE TABLE Employee
(
employee_id INT PRIMARY KEY
,employee_name VARCHAR(100) NOT NULL
,employee_address VARCHAR(100) NOT NULL
);
Запрос1
INSERT INTO Employee (employee_id, employee_name, employee_address)
VALUES (1,'RON','23-B, TORONTO');
Запрос2
INSERT INTO Employee (employee_id, employee_name, employee_address)
VALUES (2,'PETER','15-C, NY');
Запрос3
INSERT INTO Employee (employee_id, employee_name, employee_address)
VALUES (3,'TED','23-C, LONDON');
Query4
INSERT INTO Employee (employee_id, employee_name, employee_address)
VALUES (4,'SORIN','09-S, VASCAUTI');
Query5
INSERT INTO Employee (employee_id, employee_name, employee_address)
VALUES (5,'RON','23-B, TORONTO');
Query6
INSERT INTO Employee (employee_id, employee_name, employee_address)
VALUES (6,'PETER','15-C, NY');
Query7
INSERT INTO Employee (employee_id, employee_name, employee_address)
VALUES (7,'SORIN','09-S, VASCAUTI');
Query8
INSERT INTO Employee (employee_id, employee_name, employee_address)
VALUES (8,'PETER','15-C, NY');
Итак, содержимое Employee будет:
employee_id employee_name employee_address
----------- ---------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------
1 RON 23-B, TORONTO
2 PETER 15-C, NY
3 TED 23-C, LONDON
4 SORIN 09-S, VASCAUTI
5 RON 23-B, TORONTO
6 PETER 15-C, NY
7 SORIN 09-S, VASCAUTI
8 PETER 15-C, NY
Query9 Мы генерируем номера строк для каждого employee_name & employee_address
кортежа
CREATE TABLE TmpEmployee
(
rownumber COUNTER(1,1) PRIMARY KEY
,employee_name VARCHAR(100) NOT NULL
,employee_address VARCHAR(100) NOT NULL
);
(COUNTER(1,1)
- это тип данных Access / SQL AutoNumber; перед каждым выполнением Query10 вам необходимо пересоздать таблицу TmpEmployee или вам нужно сжать Access DB для сброса rownumber
counter до 1) и
Query10
INSERT INTO TmpEmployee (employee_name, employee_address)
SELECT e.employee_name, e.employee_address
FROM Employee e
GROUP BY e.employee_name, e.employee_address
Результаты:
rownumber employee_name employee_address
----------- ---------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------
1 PETER 15-C, NY
2 RON 23-B, TORONTO
3 SORIN 09-S, VASCAUTI
4 TED 23-C, LONDON
Query11 Окончательные результаты:
SELECT e.*, t.RowNumber AS DenseRank
FROM Employee e
INNER JOIN TmpEmployee t ON e.employee_name = t.employee_name AND e.employee_address = t.employee_address
ORDER BY e.employee_name, e.employee_address
Результаты:
2 PETER 15-C, NY 1
6 PETER 15-C, NY 1
8 PETER 15-C, NY 1
5 RON 23-B, TORONTO 2
1 RON 23-B, TORONTO 2
4 SORIN 09-S, VASCAUTI 3
7 SORIN 09-S, VASCAUTI 3
3 TED 23-C, LONDON 4
Решение 2 Запрос 9 Окончательные результаты:
SELECT e.*, c.RowNumber
FROM Employee e INNER JOIN
(
SELECT a.employee_name, a.employee_address, COUNT(b.employee_name) AS RowNumber
FROM
(
SELECT e.employee_name, e.employee_address
FROM Employee e
GROUP BY e.employee_name, e.employee_address
) a,
(
SELECT e.employee_name, e.employee_address
FROM Employee e
GROUP BY e.employee_name, e.employee_address
) b
WHERE a.employee_name > b.employee_name OR a.employee_name = b.employee_name AND a.employee_address >= b.employee_address
GROUP BY a.employee_name, a.employee_address
) c ON e.employee_name = c.employee_name AND e.employee_address = c.employee_address
ORDER BY c.employee_name, c.employee_address