Эквивалент функции density_rank () в базе данных доступа - PullRequest
1 голос
/ 15 сентября 2011

Поскольку у нас есть функция density_rank на сервере sql, есть ли у нас какой-нибудь эквивалент в доступе?

У меня есть стол

employee_name employee_address
RON           23-B, TORONTO
PETER         15-C, NY
TED           23-C, LONDON
RON           23-B, TORONTO

Я должен добавить новый столбец в эту таблицу следующим образом:

employee_name employee_address   employee_no
RON           23-B, TORONTO      1
PETER         15-C, NY           2
TED           23-C, LONDON       3
RON           23-B, TORONTO      1

1 Ответ

1 голос
/ 15 сентября 2011
  • Я предполагаю, что вы хотите порт в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...