Получение отличительного идентификатора (FK) по последней дате в SQL Server

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

Вот моя диаграмма

|  ID  |    ModelID     |    LocationId   |  DateCreated  |
|------+----------------+-----------------+---------------|
|   1  |       1        |        5        |   02/03/2019  |
|   2  |       2        |      null       |   01/14/2019  |
|   3  |       2        |        0        |   02/03/2019  |
|   4  |       2        |        5        |   12/30/2018  |
|   5  |       4        |        3        |   01/10/2019  |
|   6  |       3        |        5        |   02/14/2019  |
|   7  |       2        |        5        |   03/13/2019  |

Итак, моя цель - выделить ModelId, но все же показать, если LocationId is null or equals to 0, то если LocationId все тот же, получить последнюю DateCreated и показать ее в списке.

Желаемый результат:

    |  ID  |    ModelID     |    LocationId   |  DateCreated  |
    +------+----------------+-----------------+---------------+
    |   1  |       1        |        5        |   02/03/2019  |
    |   2  |       2        |      null       |   01/14/2019  |<-still show
    |   3  |       2        |        0        |   02/03/2019  |<-still show
    |   4  |       2        |        5        |   03/13/2019  |<-The Latest
    |   5  |       4        |        3        |   01/10/2019  |
    |   6  |       3        |        5        |   02/14/2019  |

Вот мой текущий SQL-запрос:

SELECT 
    a.ModelID, a.LocationId,
    (SELECT TOP 1 
         CONVERT(NVARCHAR, DateCreated, 101) 
     FROM 
         db.DeliveryDates 
     WHERE
         isDeleted = 0 
         AND DeliveryId = a.DeliveryId) AS DateCreated,
FROM 
    db.DeliveryCarInfo a
WHERE
    a.isDeleted = 0
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
0
64
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Вы можете попробовать запрос ниже. Союз поможет получить желаемый результат.

with cte
as 
(
SELECT a.ModelID 
        , a.LocationId 
        , (Select top 1 convert(nvarchar,DateCreated,101) from 
        db.DeliveryDates where isDeleted=0 and DeliveryId=a.DeliveryId) as 
         DateCreated
FROM db.DeliveryCarInfo a
WHERE a.isDeleted = 0
)
select ModelID, LocationId, DateCreated 
from cte 
where isnull(LocationId, 0) = 0

union

select ModelID, LocationId, max(DateCreated) as DateCreated
from cte
where isnull(LocationId, 0) != 0
group by ModelID, LocationId

сэр, я попробовал это решение, но почему я получаю ModelID is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause. в группе? Это

Enrique Gil 13.03.2019 06:42

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

Mukesh Arora 13.03.2019 06:45

Почему мне нужно вызвать каждому столбцу в моей группе, теперь он ищет DateCreated

Enrique Gil 13.03.2019 06:59

попробуйте еще раз... пожалуйста, поделитесь структурой таблицы с некоторыми примерами данных, чтобы я мог выполнить запрос и исправить проблемы с синтаксисом. Все столбцы, которые вы хотите выбрать, должны быть частью групповой или агрегатной функции. если у нас есть уникальные записи (modelId и locationId), то нам не нужна функция group by и max. как я и предполагал для нулевого и нулевого местонахождения сценариев.

Mukesh Arora 13.03.2019 07:07

Пожалуйста, попробуйте это.

SELECT A.* from @tbl A
INNER JOIN
(
    SELECT ModelId,Max(DateCreated) As CreateDate from @tbl Group By ModelId
) As B
    ON B.ModelId = A.ModelId
    AND A.DateCreated = B.CreateDate

 UNION 

 Select * from @tbl A
 WHERE LocationId IS NULL OR LocationId = 0

сэр, как я могу применить таблицы для db.DeliveryCarInfo и db.DeliveryDates в вашем коде. Прости

Enrique Gil 13.03.2019 05:42

Пожалуйста, замените это (From) "SELECT ModelId, Max (DateCreated) As CreateDate from tbl Group By ModelId" Замените на " SELECT ModelId, Max (DateCreated) As CreateDate из DeliveryCarInfo DCR INNER JOIN DeliveryDates DD ON DCR.Id = DCR.Id Group По DCR.ModelId", а также заменить tbl на "DeliveryCarInfo"

Morang 13.03.2019 05:55

Вы можете использовать ROW_NUMBER()

SELECT ModelID, LocationId, DateCreated FROM  (
    SELECT 
        a.ModelID, a.LocationId,
        CONVERT(NVARCHAR, d.DateCreated, 101) AS DateCreated,
        ROW_NUMBER() OVER(PARTITION BY a.ModelID, a.LocationId ORDER BY d.DateCreated DESC) RN
    FROM 
        db.DeliveryCarInfo a
            LEFT JOIN db.DeliveryDates d ON d.DeliveryId = a.DeliveryId AND d.isDeleted = 0 
    WHERE
        a.isDeleted = 0
) AS T WHERE RN = 1
Ответ принят как подходящий

Пожалуйста, попробуйте с кодом ниже

DECLARE @DeliveryCarInfo TABLE (id int,modelId int,locationId int null,DateCreated date)

INSERT INTO @DeliveryCarInfo
(
    id,
    modelId,
    locationId,
    DateCreated
)
VALUES
(1  ,1 ,5,'02/03/2019'),
(2  ,2 ,null,'01/14/2019'), 
(3  ,2 ,0,'02/03/2019'),
(4  ,2 ,5,'12/30/2018'),
(5  ,4 ,3,'01/10/2019'),
(6  ,3 ,5,'02/14/2019'),
(7  ,2 ,5,'03/13/2019')

Select X.Id,X.modelId,X.locationId,X.DateCreated from (SELECT *,row_number() OVER (PARTITION by modelId,locationId ORDER BY dateCreated desc)R FROM @DeliveryCarInfo

)X
WHERE X.R=1

ORDER BY X.modelId,X.DateCreated

Спасибо, сэр, но это также удаление дубликата modelId, даже если его null и 0 приходят 2 значения

Enrique Gil 13.03.2019 08:35

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

Md. Mustafizur Rahman 13.03.2019 09:13

Принято как ответ, большое спасибо, сэр! застрял на этом коде уже полтора дня! действительно спасает жизнь

Enrique Gil 14.03.2019 09:41

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