Повторяющиеся строки при попытке получить последний ряд другой таблицы - PullRequest
0 голосов
/ 19 июня 2019

Я пытаюсь получить ссылку на последнюю (последнюю) статью блога за каждый месяц, используя хранимую процедуру, но не могу найти пути решения моей проблемы.

В настоящее время мой код ниже повторяет столбец 'LINK' (последняя статья в блоге) примерно так:

Results table

SELECT AVG(DATEPART(mm, b.blog_date)) AS MonthNum --CANNOT USE MONTHNUM IN ORDER BY UNLESS WRAPPED WITH AVG() [average], weird but works
 , CAST(DateName(month, DateAdd(month, Datepart(MONTH, b.blog_date), -1)) AS varchar(24)) AS MONTH
 , CAST(DATEPART(YEAR, b.blog_date) AS varchar(4)) AS YEAR
 , CAST(count(b.blog_content) AS varchar(24)) as ARTICLES
 , (SELECT TOP (1) b.blog_url
     FROM Management.Blog
     WHERE (website_owner_id = 2)
     GROUP BY blog_date
            , blog_url
     ORDER BY blog_date DESC
  ) AS LINK
 , CAST(DateName(month, DateAdd(month, Datepart(MONTH, b.blog_date), -1)) AS varchar(24)) + CAST(DATEPART(YEAR, b.blog_date) AS varchar(4)) AS ID
 , blog_date as DATE
FROM Management.Blog b 
WHERE b.website_owner_id = 2
GROUP BY CAST(DateName(month, DateAdd(month, Datepart(MONTH, b.blog_date), -1)) AS varchar(24))
  , CAST(DATEPART(YEAR, b.blog_date) AS varchar(4))
  , b.blog_url
  , blog_date
  , CAST(DateName(month, DateAdd(month, Datepart(MONTH, b.blog_date), -1)) AS varchar(24)) + CAST(DATEPART(YEAR, b.blog_date) AS varchar(4))
 ORDER BY DATE DESC

Я понимаю, что код ужасно читать (и, вероятно, выполнять на SQL-сервере тоже), но я нахожусь в состоянии, когда я только новичок в SQL-сервере (выходец из MySQL, где мне действительно приходилось использовать базовый запрос выбора), и я открыт для любых предложений по изменению запроса и / или оформления таблицы.

По существу не должно быть дубликатов столбца ID (который действительно добавляется только для помощи в удалении дубликатов и может быть опущен при необходимости).

Ответы [ 2 ]

0 голосов
/ 19 июня 2019

I нефункциональный запрос обычно не очень хорошо передает то, что кто-то хочет. На основании вашего объяснения:

Я пытаюсь получить ссылку на последнюю (последнюю) статью блога за каждый месяц

Я бы ожидал что-то вроде этого:

SELECT b.*
FROM (SELECT b.*,
             ROW_NUMBER() OVER (PARTITION BY YEAR(b.blog_date), MONTH(b.blog_date), b.blog_url, b.website_owner_id
                                ORDER BY blog_date DESC
                               ) as seqnum
      FROM Management.Blog b 
     ) b
WHERE b.website_owner_id = 2 AND
      seqnum = 1;
0 голосов
/ 19 июня 2019

Без примеров данных я не могу проверить, будет ли это работать

После FROM Management.Blog b Добавьте это

INNER JOIN(
    SELECT   MonthNum   = DATEPART(MONTH, BL.blog_date))
            ,blog_date
            ,RN         = ROW_NUMBER()OVER(ORDER BY BL.blog_date DESC)
            ,BL.blog_url
    FROM    Management.Blog BL
) X ON  B.blog_date = X.blog_date
    AND X.RN = 1

Заменить

(SELECT TOP (1) b.blog_url
     FROM Management.Blog
     WHERE (website_owner_id = 2)
     GROUP BY blog_date
            , blog_url
     ORDER BY blog_date DESC
  ) AS LINK

с

X.blog_url AS [LINK]

изменить это на GROUP BY

, b.blog_url

с

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