Все заказы последнего дня месяца по каждому сотруднику

Используя базу данных 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;

Этот запрос возвращает последние дни месяцев для каждого сотрудника, но мне не удалось получить заказы.

Похоже на Получить 1 верхнюю строку каждой группы, но используя (DENSE_)RANK вместо ROW_NUMBER.

Thom A 12.06.2024 13:04

это вариант Get TOP 1 of group, где группа представляет собой комбинацию года и месяца. Лол, @ThomA меня опередил

siggemannen 12.06.2024 13:04

Отвечает ли это на ваш вопрос? Получите 1 верхний ряд в каждой группе

siggemannen 12.06.2024 13:05

Возможно, эта скрипта поможет нам совместно найти решение dbfiddle.uk/JdZ2gw60

Bart McEndree 12.06.2024 14:23
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
4
64
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Решение с использованием 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 21 апреля 1998 г. 2 11038,11039

Возвращен 1 пример из 192 строк.

спасибо за ваше полезное решение, как мне показать порядок следования столбцов в отдельных строках друг под другом?

graychar 12.06.2024 16:47

Попробуйте это для получения всех деталей заказа dbfiddle.uk/nap5xsAf Обратите внимание, что для emp # 1 от 21 апреля 1998 г. у вас есть 2 строки.

Bart McEndree 12.06.2024 16:50

@T N, спасибо. хороший улов. Запрос исправлен.

Bart McEndree 12.06.2024 16:54

Это решение использует 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 17 июля 1996 г. 10258 1 29 августа 1996 г. 10293 1 27 сентября 1996 г. 10316 1 29 октября 1996 г. 10340 1 26 ноября 1996 г. 10364 1 27 декабря 1996 г. 10396 1 6 января 1997 г. 10405 1 28 февраля 1997 г. 10461 1 26 марта 1997 г. 10486 1 16 апреля 1997 г. 10508 1 23 мая 1997 г. 10546 1 25 июня 1997 г. 10579 1 31 июля 1997 г. 10616 1 13 августа 1997 г. 10630 1 24 сентября 1997 г. 10680 1 27 октября 1997 г. 10718 1 19 ноября 1997 г. 10746 1 1997-12-26 10800 1 29 января 1998 г. 10859 1 27 февраля 1998 г. 10916 1 30 марта 1998 г. 10984 1 21 апреля 1998 г. 11038 1 21 апреля 1998 г. 11039

Другие вопросы по теме