2017-01-11 6 views
0

вы можете мне помочь отфильтровать результаты следующего запросаT-SQL группы запросов по

SELECT ProjectName = p.Code ,LotName = lp.Nom , PhaseActive = ph.Nom ,Item = l.Code, Value = c.Note, Cycle = cdv.Nom, Pole = lp.Pole, Note = lp.Note, idEdition = lp.IdEdition, c.DateCreation 
        FROM Controles c 
        Join LotProjets lp ON c.IdLotProjet = lp.IdLotProjet 
        JOIN Projets p ON lp.IdProjet = p.IdProjet 
        JOIN Referentiels r ON c.IdReferentiel = r.IdReferentiel 
        JOIN Livrables l ON r.LivrableId = l.IdLivrable 
        JOIN Phases ph ON lp.IdPhase = ph.IdPhase 
        JOIN CycleDeVies cdv ON ph.CycleDeVieId = cdv.IdCycleDeVie 
        WHERE lp.IdEdition = 3 AND c.DateSuppression IS NULL 

Который дает следующий результат

# | ProjectName | LotName | PhaseActive | Item | Value | Cycle | Pole | Note | idEdition | DateCreation 
1 | P00935  | 06  | Fin de cycle | CVAI | 0  | Autre | TRV | 47 | 3   | 2016-12-21 13:42:54.867 
2 | P00935  | 06  | Fin de cycle | DCN-T | 100 | Autre | TRV | 47 | 3   | 2016-12-21 13:42:55.500 
3 | P00935  | 06  | Fin de cycle | PTA | 33 | Autre | TRV | 47 | 3   | 2016-12-21 13:42:58.493 
4 | P00935  | 06  | Fin de cycle | DPE | 100 | Autre | TRV | 47 | 3   | 2016-12-21 13:43:00.903 
5 | P00935  | 06  | Fin de cycle | BTA | 98 | Autre | TRV | 47 | 3   | 2016-12-21 13:43:01.617 
6 | P00935  | 06  | Fin de cycle | FPH | 72 | Autre | TRV | 47 | 3   | 2016-12-21 13:43:06.987 
7 | P00935  | 06  | Fin de cycle | QSE | 0  | Autre | TRV | 47 | 3   | 2016-12-21 13:43:10.013 
8 | P00935  | 06  | Fin de cycle | DPE | 0  | Autre | TRV | 47 | 3   | 2016-12-21 13:43:15.313 
9 | P00935  | 06  | Fin de cycle | DPE | 98 | Autre | TRV | 47 | 3   | 2017-01-11 12:13:44.660 
10 | P00935  | 06  | Fin de cycle | DPE | 77 | Autre | TRV | 47 | 3   | 2017-01-11 12:16:32.557 
11 | P00935  | 05  | Fin de cycle | DPE | 75 | Autre | TRV | 47 | 3   | 2017-01-11 12:16:32.557 

Для каждого элемента в каждой LotName Я хотел бы последнее значение имеет следующий результат.

# | ProjectName| LotName | PhaseActive | Item | Value | Cycle | Pole | Note | idEdition | DateCreation 
1 | P00935  | 06  | Fin de cycle | CVAI | 0  | Autre | TRV | 47 | 3   | 2016-12-21 13:42:54.867 
2 | P00935  | 06  | Fin de cycle | DCN-T | 100 | Autre | TRV | 47 | 3   | 2016-12-21 13:42:55.500 
3 | P00935  | 06  | Fin de cycle | PTA | 33 | Autre | TRV | 47 | 3   | 2016-12-21 13:42:58.493 
4 | P00935  | 06  | Fin de cycle | DPE | 100 | Autre | TRV | 47 | 3   | 2016-12-21 13:43:00.903 
5 | P00935  | 06  | Fin de cycle | BTA | 98 | Autre | TRV | 47 | 3   | 2016-12-21 13:43:01.617 
6 | P00935  | 06  | Fin de cycle | FPH | 72 | Autre | TRV | 47 | 3   | 2016-12-21 13:43:06.987 
7 | P00935  | 06  | Fin de cycle | QSE | 0  | Autre | TRV | 47 | 3   | 2016-12-21 13:43:10.013 
8 | P00935  | 06  | Fin de cycle | DPE | 77 | Autre | TRV | 47 | 3   | 2017-01-11 12:16:32.557 
9 | P00935  | 05  | Fin de cycle | DPE | 75 | Autre | TRV | 47 | 3   | 2017-01-11 12:16:40.435 

Я думал, что должен использовать предложение GROUP BY, но я не могу найти конфигурацию, где он работает. У тебя есть решение?

+0

Do 'MAX (DateCreation)' и следовать общему правилу 'GROUP BY', который говорит: Если указано предложение GROUP BY, каждая ссылка столбца в списке SELECT должна либо идентифицировать столбец группировки, либо быть аргументом функции набора! – jarlh

+0

... или просто используйте оконную функцию 'MAX (DateCreation) OVER (ORDER BY ....)' – Jamiec

ответ

1

разделения данных, число строк в каждой секции, а также принимать строки, где номер строки 1:

with cte as (
SELECT ProjectName = p.Code ,LotName = lp.Nom , PhaseActive = ph.Nom ,Item = l.Code, Value = c.Note, Cycle = cdv.Nom, Pole = lp.Pole, Note = lp.Note, idEdition = lp.IdEdition, c.DateCreation, 
row_number() over (partition by LotName, Item order by DateCreation desc) as rn 
        FROM Controles c 
        Join LotProjets lp ON c.IdLotProjet = lp.IdLotProjet 
        JOIN Projets p ON lp.IdProjet = p.IdProjet 
        JOIN Referentiels r ON c.IdReferentiel = r.IdReferentiel 
        JOIN Livrables l ON r.LivrableId = l.IdLivrable 
        JOIN Phases ph ON lp.IdPhase = ph.IdPhase 
        JOIN CycleDeVies cdv ON ph.CycleDeVieId = cdv.IdCycleDeVie 
        WHERE lp.IdEdition = 3 AND c.DateSuppression IS NULL 
) 
select * 
from cte 
where rn = 1 
Смежные вопросы