Используя Макс, чтобы выбрать последнюю дату - PullRequest
0 голосов
/ 20 июня 2019

Я объединяю 3 таблицы с общим столбцом «Load-Id» таблицы OD. ОЙ. и MD. MD имеет EDI-файл, который при передаче электронного файла изменяется на другое имя, поэтому мне нужно отображать только данные, возвращенные из последнего обновленного имени файла.

Я пробовал различные группы и заказы, а затем прочитал, что могу создать новый столбец, соединяющий данные с последним обновленным именем файла, используя дату соединения и Макс, но продолжаю сталкиваться с ошибками синтаксиса

SELECT  TOP(100)PERCENT
    OD. *
    OH.[LOAD_ID] AS [OHLOADID],
    OH.[CARRIER],
    OH.[CLIENT_REF],
    MD.[LOAD_ID] AS [MDLOADID],
    MD.[MR_FILE] AS [POFILE]
        JOIN (SELECT MR_FILE, MAX(MR_DATE) AS [MDTRANDATE] 
        FROM dbo.mates_det MD 
        GROUP BY MR_FILE) MRD ON MD.MR_DATE = MRD.MR_DATE
FROM dbo.out_det OD
LEFT OUTER JOIN DBO.out_head OH ON OH.[LOAD_ID] = OD.[LOAD_ID]
LEFT OUTER JOIN DBO.mates_det ON MD.[LOAD_ID] = OD.[LOAD_ID]

    GROUP BY OD.PALLET_ID, OD.SEQ_NO 
    ORDER BY OD.PALLET_ID, OD.SEQ_NO

Возврат 1 строки на идентификатор паллета и последовательность, и теперь все данные дублируются, если существует более одного имени файла MRfile. Имя начинается с PO, а затем номер места 244, а затем номер почтового файла, который содержит электронные данные. Другими словами
PO2440001.000.zip
PO2440002.000.zip
и так далее. при достижении PO2449999.000.zip нумерация файлов начинается заново с PO2440001.000.zip, поэтому я использую дату MRfile.

Из комментариев выдается сообщение об ошибке

Сообщение 156, Уровень 15, Состояние 1, Строка 118 Неверный синтаксис рядом с ключевым словом 'ПРИСОЕДИНИТЬСЯ'. Сообщение 102, Уровень 15, Состояние 1, Строка 120 Неверный синтаксис рядом 'МОБ'.

Ответы [ 2 ]

0 голосов
/ 20 июня 2019

Проблема заключается в следующем коде:

MD.[MR_FILE] AS [POFILE]
    JOIN (SELECT MR_FILE, MAX(MR_DATE) AS [MDTRANDATE] 
    FROM dbo.mates_det MD 
    GROUP BY MR_FILE) MRD ON MD.MR_DATE = MRD.MR_DATE

Вы ставите MRD.MR_DATE в качестве условия соединения. Но когда вы произвели агрегирование, вы дали столбцу MR_DATE псевдоним столбца AS [MDTRANDATE].

Таким образом, вы должны использовать указанный вами псевдоним:

MD.[MR_FILE] AS [POFILE]
    JOIN (SELECT MR_FILE, MAX(MR_DATE) AS [MDTRANDATE] 
    FROM dbo.mates_det MD 
    GROUP BY MR_FILE) MRD ON MD.MR_DATE = MRD.[MDTRANDATE]
0 голосов
/ 20 июня 2019

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

SELECT *
FROM (
        SELECT 
              OD. *
            , OH.[LOAD_ID]      AS [OHLOADID]
            , OH.[CARRIER]
            , OH.[CLIENT_REF]
            , MD.[LOAD_ID]      AS [MDLOADID]
            , MD.[MR_FILE]      AS [POFILE]
            , ROW_NUMBER() OVER (PARTITION BY  OD.PALLET_ID, OD.SEQ_NO
                                ORDER BY MD.MR_DATE DESC) AS rn
        FROM dbo.out_det OD
        LEFT OUTER JOIN dbo.out_head  OH ON OH.[LOAD_ID] = OD.[LOAD_ID]
        LEFT OUTER JOIN dbo.mates_det MD ON MD.[LOAD_ID] = OD.[LOAD_ID]
  ) X
WHERE x.rn = 1
ORDER BY X.PALLET_ID, X.SEQ_NO
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...