ВЫБЕРИТЕ МАКСИМАЛЬНУЮ ДАТУ ИЗ НЕСКОЛЬКИХ ДАТ

#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