Используя базу данных Northwind на Microsoft SQL Server, я пытаюсь найти последний день каждого месяца, в который каждый сотрудник разместил заказ, а также все заказы этого сотрудника в этот день.
например: 17 июля 1996 г. был последний день месяца, когда сотрудник 1 разместил заказ. Мне нужны все заказы сотрудника 1 с этого дня.
select EmployeeID, max(convert(date, orderdate)) as LastDay
from northwind.dbo.Orders
group by YEAR(OrderDate),MONTH(OrderDate),EmployeeID
order by EmployeeID,LastDay;
Этот запрос возвращает последние дни месяцев для каждого сотрудника, но мне не удалось получить заказы.
это вариант Get TOP 1 of group, где группа представляет собой комбинацию года и месяца. Лол, @ThomA меня опередил
Отвечает ли это на ваш вопрос? Получите 1 верхний ряд в каждой группе
Возможно, эта скрипта поможет нам совместно найти решение dbfiddle.uk/JdZ2gw60
Решение с использованием CTE. Поскольку 2 — это максимальное количество заказов, размещенных любым сотрудником в последний день месяца, мы можем получить компактный набор результатов, используя STRING_AGG.
WITH CTE as
(
SELECT EmployeeID, max(convert(date, orderdate)) as LastDay
FROM Orders
GROUP BY YEAR(OrderDate),MONTH(OrderDate),EmployeeID
)
SELECT c.EmployeeID,
c.LastDay as LastDayOFMonth,
Count(*) as [Order Count],
STRING_AGG(o.orderID,',') as [Orders]
FROM ORDERS o
INNER JOIN CTE c on c.EmployeeID=o.EmployeeID
AND c.LastDay=convert(date, o.orderdate)
GROUP BY c.EmployeeID, c.LastDay
ORDER BY c.EmployeeID, c.LastDay
Возвращен 1 пример из 192 строк.
спасибо за ваше полезное решение, как мне показать порядок следования столбцов в отдельных строках друг под другом?
Попробуйте это для получения всех деталей заказа dbfiddle.uk/nap5xsAf Обратите внимание, что для emp # 1 от 21 апреля 1998 г. у вас есть 2 строки.
@T N, спасибо. хороший улов. Запрос исправлен.
Это решение использует DENSE_RANK и более эффективно.
WITH CTE as
(
SELECT o.*,
DENSE_RANK() OVER (PARTITION BY YEAR(OrderDate),MONTH(OrderDate),EmployeeID ORDER BY orderdate DESC) AS rn
FROM Orders o
)
SELECT c.EmployeeID,
c.orderdate as LastDayOFMonth,
c.orderID
FROM cte c
WHERE c.rn=1
ORDER BY c.EmployeeID, c.orderdate
повозитесь со сравнением затрат
Похоже на Получить 1 верхнюю строку каждой группы, но используя
(DENSE_)RANK
вместоROW_NUMBER
.