#java #sql #sql-server #spring-boot
#java #sql #sql-сервер #spring-boot
Вопрос:
Это мой текущий запрос:
SELECT e.*, j.application_date
FROM employee e JOIN job_application j ON e.Id=j.employeeId
WHERE j.status IN ('test1', 'test2')
ORDER BY j.application_date DESC
Я выполняю СОЕДИНЕНИЕ с двумя таблицами, но мне не нужно показывать повторяющиеся данные с помощью e.Идентификатор в качестве столбца для фильтрации дубликатов.
Кроме того, он должен быть отсортирован по столбцу j.application_date, чтобы иметь возможность получать самые последние
ОБНОВЛЕНИЕ 1
Я использовал DISTINCT
тег позади SELECT
, но он не работает, потому что строки не совсем одинаковые, вот почему он не работает.
Я не знаю, как заставить его давать мне уникальные строки с учетом одного столбца (e.Id или j.EmployeeID)
ОБНОВЛЕНИЕ 2
Если у меня есть эти 2 таблицы:
таблица сотрудников
Id | FirstName | LastName | YearOfBirth
--------------------------------------------------------
0 | Thomas | Smith | 1977
1 | Peter | Edison | 1969
2 | Albon | Boeraner | 1995
3 | Mary | Caters | 1982
таблица job_application
Id | employeeId | application_date | address | status
---------------------------------------------------------------------
0 | 1 | 2018-05-14 | address 1 | test1
1 | 1 | 2018-02-19 | address 2 | test3
2 | 1 | 2019-08-27 | address 3 | test2
3 | 3 | 2019-11-16 | address 4 | test1
Мне нужно показать для employee = 1 только строку, в которой application_date = 2019-08-27, и отбросить другую (application_date = 2018-05-14)
Ответ №1:
используйте этот:
select e2.* , T2.Mapplication_date
from (select e.Id, max(j.application_date ) as Mapplication_date
FROM employee e JOIN job_application j ON e.Id=j.employeeId
group by e.Id ) as T2
JOIN employee e2 ON e2.Id= T2.Id
Комментарии:
1. Я использовал тег «DISTINCT» за SELECT, но он не работает, потому что строки не совсем одинаковые, поэтому он не работает
2. Я не знаю, как заставить его давать мне уникальные строки с учетом одного столбца (e.Id или j.EmployeeID)
3. можете ли вы добавить некоторые из ваших данных и желаемый результат?
Ответ №2:
Вы можете использовать apply
:
SELECT e.*, j.application_date
FROM employee e CROSS APPLY
(SELECT TOP (1) j.*
FROM job_application j
WHERE j.employeeId = e.id AND
j.status IN ('test1', 'test2')
ORDER BY j.application_date DESC
) j;
Вы ищете только один столбец, поэтому коррелированный подзапрос также будет работать:
SELECT e.*,
(SELECT TOP (1) j.application_date
FROM job_application j
WHERE j.employeeId = e.id AND
j.status IN ('test1', 'test2')
ORDER BY j.application_date DESC
) as application_date
FROM employee e;
Используемая версия apply
позволяет возвращать больше столбцов, если хотите. И эта версия также возвращает всех сотрудников, а не только тех, у кого есть совпадения.
Ответ №3:
Используйте CTE для нумерации каждого приложения для сотрудника по дате, используя row_number . Таким образом, вы можете присоединиться только к последнему приложению (число = 1)
with last_application as (
select employeeId, application_date,
row_number() over (partition by employeeId order by application_date desc) as num
from job_application
where status IN ('test1', 'test2')
)
select e.*, j.application_date
from employee
inner join last_application j on j.employee_id = e.Id and j.num = 1