ВЫБЕРИТЕ ОТЛИЧИТЕЛЬНЫЙ УНИКАЛЬНЫЙ - PullRequest
0 голосов
/ 09 мая 2020

У меня есть таблица продуктов, и мне нужно извлечь из каждого idproduct последние 3 уникальные записи IDFornecedor, ie

image1

Результат: image2

Код:

WITH x AS (SELECT        dbo.ItensDocumentos.Referencia, dbo.Documentos.Data, dbo.FacturasFornecedor.IDFornecedor, dbo.ItensDocumentos.IDProduto, dbo.Fornecedores.Nome, dbo.Documentos.BaseIncidenciaIva, 
                         dbo.ItensDocumentos.Quantidade, dbo.ItensDocumentos.TotalIliquido / dbo.ItensDocumentos.Quantidade AS Valor 
FROM                     dbo.ItensDocumentos INNER JOIN
                         dbo.Documentos ON dbo.ItensDocumentos.IDDocumento = dbo.Documentos.IDDocumento INNER JOIN
                         dbo.FacturasFornecedor ON dbo.Documentos.IDDocumento = dbo.FacturasFornecedor.IDDocumento INNER JOIN
                         dbo.Fornecedores ON dbo.FacturasFornecedor.IDFornecedor = dbo.Fornecedores.IDFornecedor
WHERE        (dbo.ItensDocumentos.TotalIliquido / dbo.ItensDocumentos.Quantidade <> 0) AND dbo.Fornecedores.IDFornecedor<> 2 ),
Y AS (SELECT * FROM X), 
Z AS (SELECT IDProduto,Data,Valor,IDFornecedor,Referencia,Nome,ROW_NUMBER() OVER (PARTITION BY IDProduto ORDER BY MAX(Data) DESC) AS Seq
           from y
           GROUP BY IDProduto,Data,Valor,IDFornecedor,Referencia,Nome)
SELECT IDProduto,Data,Valor,IDFornecedor,Referencia,Nome,Seq,PorDefeito = 0,PrazoREposicao = 0 from z WHERE Seq <= 3 order by Referencia asc

1 Ответ

0 голосов
/ 09 мая 2020

Если вы хотите, чтобы для каждого продукта использовались последние три отдельных поставщика, в одном варианте используется агрегирование и row_number() (если ваша база данных поддерживает оконные функции):

select *
from (
    select 
        idProduto, 
        idFornecedor,
        max(data) maxData,
        row_number() over(partition by idProduto order by max(data) desc
    from mytable
    group by idProduto, idFornecedor
) t
where rn <= 3
order by idProduto, idFornecedor, rn desc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...