Получение отличительного идентификатора (FK) по самой последней дате в SQL Server - PullRequest
0 голосов
/ 13 марта 2019

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

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

|  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

Ответы [ 4 ]

1 голос
/ 13 марта 2019

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

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
1 голос
/ 13 марта 2019

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

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
1 голос
/ 13 марта 2019

Вы можете использовать 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
1 голос
/ 13 марта 2019

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

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
...