SQL - Выбрать с помощью группы, Получить данные из регистра с максимальным (дата) - PullRequest
0 голосов
/ 23 апреля 2020

У меня есть две таблицы в базе данных: Product и ProductVersion , каждый продукт может иметь n ProductVersions. У ProductVersion есть следующие поля (идентификатор, имя, происхождение, дата, поставщик)

Я хочу запрос, в котором я получаю информацию о продукте и в той же регистрации регистрирую информацию о версии продукта с максимальной датой, что-то вроде этого:

select
p.ProductId, p.ProductName , max(pv.date), name of  max(pv.date), origin of  max(pv.date)
from Product p Join ProductVersion pv on p.ProductId = pv.ProductId
where userId = 'test_user'
group by p.Id

Я хочу создать представление для вызова из c#, я работаю с linq, но производительность в этом случае не очень хорошая, поэтому я пытаюсь получить представление с нужной мне информацией. Нечто подобное я хочу достичь с помощью запроса SQL.

var result =
_context.ProductVersion
    .Where(x => x.UserId == userId)
    .GroupBy(x => x.ProductId)
    .Select(group => group.OrderByDescending(x => x.Date).FirstOrDefault())
    .Include(x => x.Product)
    .ToList();

Ответы [ 2 ]

1 голос
/ 23 апреля 2020

Это должно сделать это.

DECLARE @userID NVARCHAR(100) = N'test_user'

WITH cte
AS
(
    SELECT
        p.ProductID
        ,p.ProductName
        ,pv.Date as VersionDate
        ,pv.Name as VersionName
        ,pv.Origin as VersionOrigin
        ,ROW_NUMBER() OVER (PARTITION BY p.ProductID ORDER BY pv.Date DESC) as PartitionID
    FROM product p
        inner join ProductVersion  pv on p.ProductId = pv.ProductID
    WHERE userID = @userID
)

SELECT 
    ProductID
    ,ProductName
    ,VersionDate
    ,VersionName
    ,VersionOrigin
FROM cte
WHERE PartitionID = 1
1 голос
/ 23 апреля 2020

Я понимаю, что вы хотите последнюю строку из ProductVersion для каждого Product. Простой и эффективный метод в SQL Сервер - это боковое соединение:

create view myview as
select p.*, pv.name, pv.origin, pv.date, pv.provider
from product p
cross apply (
    select top (1) *
    from productVersion pv
    where p.productId = pv.productId
    order by pv.date desc
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...