Выбор МИН. (дата) и МАКС. (дата) с МАКС. (дата) значениями фрахта

Мне нужны MIN (дата заказа) и MAX (дата заказа) со значениями MAX (дата заказа) Freight.

Я пытался использовать CTE, и я изо всех сил пытаюсь удалить повторяющиеся строки для CustomerID.

USE Northwind
GO

WITH CTE AS (
SELECT a.customerID,
    MAX(b.OrderDate) AS LastOrder,
    MIN(b.OrderDate) AS FirstOrder

    FROM Orders AS b
INNER JOIN Customers AS a 
ON b.CustomerID = a.CustomerID
GROUP BY a.CustomerID
)

SELECT CTE.customerID, CTE.FirstOrder, d.OrderDate as LastOrder, d.Freight
FROM CTE 
INNER JOIN Orders as d
On CTE.CustomerID = d.CustomerID 
GROUP BY CTE.CustomerID, CTE.FirstOrder, d.Freight, d.OrderDate
HAVING d.OrderDate = MAX(d.OrderDate)

Я пытаюсь получить эти результаты, которые должны отображать 89 записей.

  CustomerID   FirstOrder   LastOrder    Freight
|  ALFKI     | 1997-08-25 | 1998-04-09 |  1.21   |
|  ANATR     | 1996-09-18 | 1998-03-04 |  39.92  |
|  ANTON     | 1996-11-27 | 1998-01-28 |  58.43  |
|  AROUT     | 1996-11-15 | 1998-04-10 |  33.80  |
|  BERGS     | 1996-08-12 | 1998-03-04 |  151.52 |

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

Ответы 2

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

Просто используйте условную агрегацию:

SELECT o.customerID,
      MAX(o.OrderDate) AS LastOrder,
      MIN(o.OrderDate) AS FirstOrder,
      MAX(CASE WHEN seqnum = 1 THEN o.freight END) as lastFreight
FROM (SELECT o.*,
             ROW_NUMBER() OVER (PARTITION BY o.customerID ORDER BY o.OrderDate DESC) as seqnum
      FROM Orders o
     ) o
GROUP BY o.CustomerID;

Обратите внимание, что вам не нужна таблица Customer. Вся необходимая информация находится в Orders (сомневаюсь, что вы используете Customer для удаления строк).

Просто чтобы все было просто и соответствовало вопросу. CTE подзапроса уже имеет идентификатор клиента и LastOrder (максимальная дата заказа). Присоединение столбца LastOrder в CTE к таблицам Order OrderDate даст ожидаемые результаты.

and d.OrderDate = CTE.LastOrder 

Полный запрос:

WITH CTE AS (
SELECT a.customerID,
    MAX(b.OrderDate) AS LastOrder,
    MIN(b.OrderDate) AS FirstOrder

    FROM Orders AS b
INNER JOIN Customers AS a 
ON b.CustomerID = a.CustomerID
GROUP BY a.CustomerID
)
SELECT CTE.customerID, CTE.FirstOrder, d.OrderDate as LastOrder, d.Freight
FROM CTE 
INNER JOIN Orders as d
On CTE.CustomerID = d.CustomerID 
and d.OrderDate = CTE.LastOrder 

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