Возврат одной даты с max (date) - PullRequest
0 голосов
/ 10 января 2020

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

INSERT INTO @temp 
(
     [Object ID]
    ,[Waarde]
    ,[Kenmerk]
)

select DISTINCT PME.OBJECTID,
                LEFT(PME.OBJECTSCORINGVALUE,LEN(PME.OBJECTSCORINGVALUE)-2),
                'P3'
FROM PMEOBJECTSCORINGPOINTS PME
LEFT JOIN PMEOBJECTSCORINGHISTORY PMEH ON PME.OBJECTSCORINGHISTORYID = PMEH.OBJECTSCORINGHISTORYID
INNER JOIN(SELECT OBJECTSCORINGHISTORYID, MAX(DATE) DATE
           FROM PMEOBJECTSCORINGHISTORY 
           WHERE DATE < DATEFROMPARTS(YEAR(getdate())-1, 12, 31)
           GROUP BY OBJECTSCORINGHISTORYID) P3 ON PME.OBJECTSCORINGHISTORYID = P3.OBJECTSCORINGHISTORYID
                                               AND PMEH.DATE = P3.DATE
                                               AND PME.ATTRIBUTEID = 'Energie-idx' 
                                               AND PME.OBJECTSCORINGVALUE <> ''

------------------
select * from @temp
order by [Object ID], [Kenmerk] ASC

Когда определенный идентификатор объекта имеет только одно известное значение до 2019-12-31, я получаю одну запись в набор результатов. Однако, если идентификатор объекта имеет два (или более) известных значения до этой даты, я все равно получу несколько результатов вместо значения для даты, ближайшей к 2019-12-31.

Любые указатели о том, как получить желаемые результаты? Заранее спасибо!

(редактировать: извините за плохую читабельность кода, спасибо за исправление)

Ответы [ 2 ]

0 голосов
/ 10 января 2020

Я исправил проблему. Оказалось, что я сделал неправильное соединение (неправильный уровень детализации). Я должен был сделать это на OBJECTID вместо OBJECTSCORINGHISTORYID. В результате max (date) было возвращено для OBJECTSCORINGHISTORYID, а не на уровне OBJECTID.

Это правильный запрос:

INSERT INTO @temp 
(
     [Object ID]
    ,[Waarde]
    ,[Kenmerk]
)

select          PME.OBJECTID,
                LEFT(PME.OBJECTSCORINGVALUE,LEN(PME.OBJECTSCORINGVALUE)-2),
                'P3'
FROM PMEOBJECTSCORINGPOINTS PME
LEFT JOIN PMEOBJECTSCORINGHISTORY PMEH ON PME.OBJECTSCORINGHISTORYID = PMEH.OBJECTSCORINGHISTORYID
INNER JOIN(SELECT OBJECTID, MAX(DATE) DATE
           FROM PMEOBJECTSCORINGHISTORY 
           WHERE DATE < DATEFROMPARTS(YEAR(getdate())-1, 12, 31)
           GROUP BY OBJECTID) P3 ON PME.OBJECTID = P3.OBJECTID
                                               AND PMEH.DATE = P3.DATE
                                               AND PME.ATTRIBUTEID = 'Energie-idx' 
                                               AND PME.OBJECTSCORINGVALUE <> ''
0 голосов
/ 10 января 2020

Используйте аналитическую функцию ROW_NUMBER (), если вы можете сортировать по столбцу, возможно P3.Date или PME.OBJECTSCORINGVALUE

select Objectid, OBJECTSCORINGVALUE,P3 
from(   
select          PME.OBJECTID,
                LEFT(PME.OBJECTSCORINGVALUE,LEN(PME.OBJECTSCORINGVALUE)-2) OBJECTSCORINGVALUE,
                'P3' Pcol,P3.Date

                row_number() over (partition by PME.OBJECTID, LEFT(PME.OBJECTSCORINGVALUE,LEN(PME.OBJECTSCORINGVALUE)-2) order by P3.Date DESC) rn
FROM PMEOBJECTSCORINGPOINTS PME
LEFT JOIN PMEOBJECTSCORINGHISTORY PMEH ON PME.OBJECTSCORINGHISTORYID = PMEH.OBJECTSCORINGHISTORYID
INNER JOIN(SELECT OBJECTSCORINGHISTORYID, MAX(DATE) DATE
           FROM PMEOBJECTSCORINGHISTORY 
           WHERE DATE < DATEFROMPARTS(YEAR(getdate())-1, 12, 31)
           GROUP BY OBJECTSCORINGHISTORYID) P3 ON PME.OBJECTSCORINGHISTORYID = P3.OBJECTSCORINGHISTORYID
                                               AND PMEH.DATE = P3.DATE
                                               AND PME.ATTRIBUTEID = 'Energie-idx' 
                                               AND PME.OBJECTSCORINGVALUE <> ''
   ) where rn=1

Здесь я упорядочиваю ответы с P3.Date и возвращаю только одно с самым высоким значением.

Гарантируется, что будет возвращена только одна строка, однако вы должны быть уверены в своих данных, чтобы быть уверенными, что они определены c

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...