Выбор последнего экземпляра столбца, но сравнение другого столбца с CASE

Я ожидаю 3 столбца: номер заказа из TOrder, идентификатор последнего экземпляра (макс. OrderEvent), и я хочу применить регистр/когда к другому столбцу (ordereventtypeid).

Номер заказа и последняя инстанция работает. Однако мне не удалось заставить работать третий столбец. По сути, я хочу получить последний экземпляр OrderEventId для каждого OrderId, а затем применить CASE/WHEN к этой строке. Ниже происходит возврат задержки «T&R» для всех из них, а не только для тех, где последний OrderEventTypeID равен «107».

SELECT 
   TOrder.OrderNumber
   ,(SELECT MAX (OrderEventID) FROM TOrderEvent
    WHERE TOrderEvent.OrderID = TOrder.OrderID
    ) AS 'Delay SubQ'
   ,CASE 
        WHEN EXISTS (SELECT MAX (OrderEventID) FROM TOrderEvent
                     WHERE TOrderEvent.OrderID = TOrder.OrderID
                       AND TOrderEvent.OrderEventTypeID IN (107)) 
            THEN 'T&R Delay'
            ELSE ''
    END AS 'Delay Case'
FROM 
    TOrder
WHERE 
    TOrder.CustomerId IN (14758, 25167)
    AND TOrder.OrderDate >= '1/1/2024'
    AND TOrder.OrderStatusID NOT IN (1206, 1208)

Я пробовал использовать подзапросы, объединения и т. д. При соединении TOrderEvent и использовании MAX ON TOrderEvent.OrderEventID я получаю строку для каждого ordereventid, а не одну строку для каждого orderid только с последним экземпляром ordereventid.

Я использую SSMS 19.0.20209 с размещенным в Azure SQL в качестве службы.

Можете ли вы предоставить образец содержимого таблицы и ожидаемые результаты запроса?

Scott Hunter 22.08.2024 17:40

Пожалуйста, прочитайте Как сделать хороший пример, а также отметьте СУБД, которую вы используете.

Jonas Metzler 22.08.2024 17:40

@ScottHunter Конечно, это приемлемо? TOrder: OrderNumber OrderId – может быть присоединен к TOrderEvent.OrderID (вот как они связаны) TOrderEvent: OrderId – связь с TOrder OrderEventId – автоматически увеличивающийся идентификационный номер (PK). Именно так идентифицируются уникальные строки событий, связанных с заказами. OrderEventTypeID – числовая классификация События. Здесь я пытаюсь применить CASE, то есть, если последний OrderEventId, связанный с заказом, имеет OrderEventTypeID «107», то возвращаю «T&R Delay».

LogisticsRay 22.08.2024 17:50

То есть в лучшем случае описание схемы таблицы, а не пример ее содержимого.

Scott Hunter 22.08.2024 18:02

Используйте row_number в подзапросе. Learn.microsoft.com/en-us/sql/t-sql/functions/…

David Browne - Microsoft 22.08.2024 18:02

@JonasMetzler Здравствуйте, я не знаю, чего еще вы от меня хотите. Код/объяснение отформатировано в соответствии с моей интерпретацией вашей ссылки. Я также сократил запрос с более чем 30 полями до 3, которые все необходимы в реляционных аспектах. Выполнение запроса сводится к минимуму, сохраняя при этом требования к отношениям.

LogisticsRay 22.08.2024 18:03

Примечание: не используйте одинарные кавычки (') для псевдонимов. Одинарные кавычки предназначены для буквальных строк и не ограничивают идентифицирующие имена объектов. У них есть некоторые «подводные камни», поскольку их поведение непоследовательно в зависимости от того, где на них ссылаются. Также устарели некоторые синтаксисы с псевдонимами литеральных строк. Придерживайтесь имен объектов и псевдонимов, которые не требуют идентификации-разделителей, а если вам необходимо их идентифицировать, используйте идентификатор T-SQL, скобки ([]) или двойные кавычки ANSI-SQL (").

Thom A 22.08.2024 18:10

Пожалуйста, добавляйте детали к своему вопросу, а не комментарии. Затем вы можете использовать форматированный код и т.д.

MatBailie 22.08.2024 18:10

Как говорят в Голливуде, показывай, не говори. Почему бы не разместить несколько строк данных в виде таблицы и ожидаемый результат

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

Ответы 1

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

Попробуйте это

SELECT 
    TOrder.OrderNumber,
    oe.MaxOrderEventID AS [Delay SubQ],
    CASE 
        WHEN oe.OrderEventTypeID = 107 THEN 'T&R Delay'
        ELSE ''
    END AS [Delay Case]
FROM 
    TOrder
CROSS APPLY
    (
        SELECT TOP 1 
            TOrderEvent.OrderEventID AS MaxOrderEventID,
            TOrderEvent.OrderEventTypeID
        FROM 
            TOrderEvent
        WHERE 
            TOrderEvent.OrderID = TOrder.OrderID
        ORDER BY 
            TOrderEvent.OrderEventID DESC
    ) oe
WHERE 
    TOrder.CustomerId IN (14758, 25167)
    AND TOrder.OrderDate >= '2024-01-01'
    AND TOrder.OrderStatusID NOT IN (1206, 1208);

Спасибо Варун Малхотра. Кажется, это работает так, как ожидалось, при первоначальном просмотре/проверке. Однако я не совсем понимаю код, поэтому буду усердно работать, чтобы убедиться, что я понимаю все аспекты. Спасибо, что научили меня.

LogisticsRay 22.08.2024 18:16

Я рад, что смог помочь! чтобы понять это, лучше прочитайте о «CROSS APPLY»

Varun Malhotra 22.08.2024 18:28

Конечно, я сейчас об этом читаю. Еще раз, большое спасибо и будьте уверены: мне не просто нужен ответ... Я возьму ответ и изучу концепцию. :)

LogisticsRay 22.08.2024 18:35

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