#sql #sql-server #tsql
#sql #sql-сервер #tsql
Вопрос:
это мой случай:
У меня есть 2 таблицы SKU
amp; Disco_Dates
.
В обеих таблицах есть похожие поля.
SKU.[MFG_PART_NUMBER] = Disco_Dates.[MATERIAL]
Мне нужно знать максимальную ДАТУ ОБНОВЛЕНИЯ, доступную для каждого MFG_PART_NUMBER
DISCO_DATE TABLE
------------- ----------------------- -----------------------
| MATERIAL |DISCO_DATE | DATE_UPDATE |
------------- ----------------------- -----------------------
|T6C25AW#ABC |NULL |2016-09-14 11:15:03.587|
|T6C25AW#ABC |2016-10-28 00:00:00.000|2016-09-21 13:45:03.591|
|T6C25AW#ABC |2016-10-31 00:00:00.000|2016-09-30 12:38:08.990|
------------- ----------------------- -----------------------
SKU TABLE
---------------
|MFG_PART_NUMBER|
---------------
|T6C25AW#ABC |
|G2F32UC#ABC |
---------------
SQL-ЗАПРОС
SELECT
t1.[MFG_PART_NUMBER]
,t2.[DISCO_DATE]
,MAX (t2.[DATE_UPDATE]) as DATE_UPDATE
FROM Test.dbo.SKU t1
LEFT JOIN Test.dbo.Tbl_Disco_Dates t2
ON [MFG_PART_NUMBER] = [MATERIAL]
WHERE t1.[MFG_PART_NUMBER] = 'T6C25AW#ABC'
group by
t1.[MFG_PART_NUMBER]
,t2.[DISCO_DATE]
Мой текущий результат дает мне все 3 строки.
Это то, что мне нужно.
---------------- ----------------------- -----------------------
|MFG_PART_NUMBER |DISCO_DATE | DATE_UPDATE |
---------------- ----------------------- -----------------------
|T6C25AW#ABC |2016-10-31 00:00:00.000|2016-09-30 12:38:08.990|
---------------- ----------------------- -----------------------
Заранее спасибо.
Ответ №1:
Попробуйте это:
SELECT
t1.[MFG_PART_NUMBER]
,t2.[DISCO_DATE]
,t2.[DATE_UPDATE] as DATE_UPDATE
FROM Test.dbo.SKU t1
LEFT JOIN Test.dbo.Tbl_Disco_Dates t2
ON [MFG_PART_NUMBER] = [MATERIAL]
WHERE t1.[MFG_PART_NUMBER] = 'T6C25AW#ABC'
AND t2.[DATE_UPDATE] = (SELECT MAX(t2.[DATE_UPDATE] FROM Test.dbo.Tbl_Disco_Dates t2)
Комментарии:
1. Довольно близко к желаемому результату. Но это привело меня к поиску ответа ВЫБЕРИТЕ t1.[MFG_PART_NUMBER] , t2.[DISCO_DATE] ,t2.[DATE_UPDATE] как DATE_UPDATE ИЗ Test.dbo.SKU t1 СЛЕВА ПРИСОЕДИНЯЕТСЯ К Test.dbo.Tbl_Disco_Dates t2 НА [MFG_PART_NUMBER] = [МАТЕРИАЛ] ГДЕ t1.[MFG_PART_NUMBER] = ‘T6C25AW#ABC’ И t2.[DATE_UPDATE] = (ВЫБЕРИТЕ MAX(t2. [DATE_UPDATE]) ИЗ Test.dbo.Tbl_Disco_Dates t2) группировать по t1.[MFG_PART_NUMBER] ,t2.[DISCO_DATE] ,t2.[DATE_UPDATE]
2. О да, я забыл, что MAX должен быть в операторе SELECT
3. Нужна ли группа по-прежнему, если вы делаете это таким образом?
4. @Kris Хороший совет, группировать по не требуется.
Ответ №2:
declare @maxdate datetime
select @maxdate = max(t2.[DATE_UPDATE]) FROM Test.dbo.SKU
select * from ( SELECT
t1.[MFG_PART_NUMBER]
,t2.[DISCO_DATE]
, DATE_UPDATE
FROM Test.dbo.SKU where DATE_UPDATE= @maxdate) t1
LEFT JOIN Test.dbo.Tbl_Disco_Dates t2
ON t1.[MFG_PART_NUMBER] = t2.[MATERIAL]
WHERE t1.[MFG_PART_NUMBER] = 'T6C25AW#ABC'
group by
t1.[MFG_PART_NUMBER]
,t2.[DISCO_DATE]
Ответ №3:
Разве простой GROUP BY
запрос не сработал бы:
SELECT MATERIAL,
MAX(DISCO_DATE) AS DISCO_DATE,
MAX(DATE_UPDATE) AS DATE_UPDATE
FROM Test.dbo.Tbl_Disco_Dates
GROUP BY MATERIAL