Найти выпуски по каждому журналу с максимальным и минимальным количеством страниц

Есть несколько журналов, в каждом из них есть определенное кол-во выпусков этих журналов и в каждом выпуске находятся несколько публикаций. У каждой публикации есть кол-во страниц. Необходимо найти для каждого журнала выпуск с максимальным/минимальным кол-вом страниц. Таблица имеет вид

CREATE table Журналы( 
id_журнала INT identity  PRIMARY KEY ,
Название VarChar(100) NOT NULL,
Издатель VArChar(100) NOT NULL
);
CREATE table Выпуски_журналов( 
Индентификатор_выпуска INT identity PRIMARY KEY,
Номер_выпуска INT NOT NULL ,
Год INT 
); 
CREATE table Публикации( 
Код_публикации INT identity PRIMARY KEY,
Индентификатор_выпуска int references Выпуски_журналов,
Название_публикации VArChar(100) NOT NULL ,
Страницы INT check (Страницы>=1 and Страницы<=15) 
);

Ответы (1 шт):

Автор решения: pegoopik

Я возможно заморочился, просто настроение такое... Короче вот:

USE tempdb

GO

IF OBJECT_ID('Публикации') IS NOT NULL DROP TABLE Публикации
IF OBJECT_ID('Выпуски_журналов') IS NOT NULL DROP TABLE Выпуски_журналов
IF OBJECT_ID('Журналы') IS NOT NULL DROP TABLE Журналы

CREATE table Журналы( 
id_журнала INT identity  PRIMARY KEY ,
Название VarChar(100) NOT NULL,
Издатель VArChar(100) NOT NULL
);
CREATE table Выпуски_журналов( 
Индентификатор_выпуска INT identity PRIMARY KEY,
Номер_выпуска INT references Журналы,
Год INT 
); 
CREATE table Публикации( 
Код_публикации INT identity PRIMARY KEY,
Индентификатор_выпуска int references Выпуски_журналов,
Название_публикации VArChar(100) NOT NULL ,
Страницы INT check (Страницы>=1 and Страницы<=15) 
);

GO

DECLARE
  @Cnt INT = 3;

;WITH CTE AS(SELECT 1 N UNION ALL SELECT N+1 FROM CTE WHERE N<@Cnt)
INSERT Журналы SELECT NEWID(), NEWID() FROM CTE

;WITH CTE AS(SELECT 1 N UNION ALL SELECT N+1 FROM CTE WHERE N<@Cnt)
INSERT Выпуски_журналов SELECT id_журнала, 
1000 + ABS(CAST(CAST(NEWID()AS VARBINARY) AS INT))%2000 --год, ну всякое бывает))
FROM Журналы, CTE

;WITH CTE AS(SELECT 1 N UNION ALL SELECT N+1 FROM CTE WHERE N<@Cnt)
INSERT Публикации
SELECT Индентификатор_выпуска, NEWID(), 1 + ABS(CAST(CAST(NEWID()AS VARBINARY) AS INT))%15
FROM CTE, Выпуски_журналов

--Собственно сам запрос

;
SELECT *
FROM(
  SELECT Z.id_журнала, Z.Издатель, Z.Название
    ,Страницы
    ,MIN(Страницы)OVER(PARTITION BY Z.id_журнала) AS Min_Cnt
    ,MAX(Страницы)OVER(PARTITION BY Z.id_журнала) AS Max_Cnt
  FROM Выпуски_журналов AS V
    JOIN Публикации AS P ON V.Индентификатор_выпуска = P.Индентификатор_выпуска
    JOIN Журналы AS Z ON Z.id_журнала = V.Номер_выпуска
  )T
WHERE страницы IN (Min_Cnt, Max_Cnt)


--To receiver:
SELECT * FROM Журналы
SELECT * FROM Выпуски_журналов
SELECT * FROM Публикации

Думаю, разберётесь..

→ Ссылка