SQL Server 2008 выбирает первую строку из нескольких таблиц?

У меня есть таблица, в которой хранятся статьи, например:

Таблица статей:

ID #CategoryID #Text #Date

Итак, на странице у меня есть разные разделы, и каждый раздел имеет свой собственный идентификатор категории. Например, спорт — 1, новости — 2 и т. д.

Теперь мне нужна возможность загрузить последнюю статью из x категорий. У меня есть SP, который принимает nvarchar с идентификаторами, разделенными пробелом.

Итак, теперь вопрос в том, как я могу выбрать последнюю вставленную статью из категорий в nvarchar?

Я использую nvarchar-to-table Эрланда Соммерскога, чтобы получить идентификаторы в таблице (http://www.sommarskog.se/arrays-in-sql-2005.html#iter-list-of-integers)

Обычно я бы использовал что-то подобное для выбора статей из нескольких категорий:

SELECT TOP 5 ArticleID, Headline, CategoryID, ShortDescription, DatePublished 
FROM Article 
WHERE ArticleState = 3 
AND CategoryID IN (SELECT i.number FROM iter_intlist_to_tbl(@Categories) AS i)
ORDER BY DatePublished DESC

Но как мне выбрать только последнюю статью из каждой из предоставленных категорий?


person Patrick    schedule 19.10.2009    source источник


Ответы (2)


SELECT  a.*
FROM    iter_intlist_to_tbl(@Categories) i
OUTER APPLY 
        (
        SELECT  TOP 1 *
        FROM    Article
        WHERE   CategoryID = i.number
                AND ArticleState = 3
        ORDER BY
                DatePublished DESC
        ) a

Это выберет последнюю статью с ArticleState = 3 из каждой категории или NULL, если в категории нет таких статей.

person Quassnoi    schedule 19.10.2009

Я знаю, что на этот вопрос был дан ответ, но вы можете ранжировать различные категории и просто использовать предложение WHERE, чтобы отфильтровать их с помощью ИЛИ, например, WHERE rankA =1 ИЛИ rankB = 1 ИЛИ rankc = 1

он напечатает все высшие ранги, например, я ранжировал зарплату и затраты в этом запросе и напечатал

WITH RESULT AS
(
    SELECT M.UserID
        ,M.FirstName
        ,M.LastName
        ,M.Salary
        ,Salary_Rank = DENSE_RANK() OVER(ORDER BY Salary DESC)
        ,M.Costs
        ,Costs_Rank = DENSE_RANK() OVER(ORDER BY Costs DESC)
    FROM temp.dbo.MainData AS M
)
SELECT R.UserID
    ,R.FirstName
    ,R.LastName
    ,R.Salary
    ,R.Salary_Rank
    ,R.Costs
    ,R.Costs_Rank

FROM RESULT AS R
WHERE Salary_Rank = 1 OR Costs_Rank = 1

Пример данных

введите здесь описание изображения

person Zabi Sidiqkhil    schedule 14.01.2019