Нельзя назначить набор псевдонимов для набора столбцов, подобных этому, поскольку подзапросу в списке SELECT разрешено возвращать не более одной строки и одного столбца. Тем не менее, можно присвоить список псевдонимов, например, то, что вы хотите, подзапросу, который используется как производная таблица , т.е. когда он находится в предложении FROM (также по обе стороны от соединения, если любой). Обычно это выглядит так:
…
FROM
(<i>subquery</i>) <i>table_alias</i> (<i>column_alias, column_alias, …</i>)
…
Итак, ваше решение может быть примерно таким:
SELECT
latest.[LatestState],
latest.[LatestDate],
previous.[PreviousState],
previous.[PreviousDate]
FROM
(
SELECT [State], [Date]
FROM Audits
WHERE <i>condition to find the highest ID</i>
) AS latest ([LatestState], [LatestDate]), /* comma join = CROSS JOIN */
(
SELECT [State], [Date]
FROM Audits
WHERE <i>condition to find the next highest ID</i>
) AS previous ([PreviousState], [PreviousDate])
Предполагая, что каждый подвыбор возвращает ровно одну строку, это должно в значительной степени дать вам то, что вы ищете.
Если вы используете SQL Server 2005 или более позднюю версию, вы можете попробовать другой подход:
WITH ranked AS (
SELECT
State,
Date,
rn = ROW_NUMBER() OVER (ORDER BY ID DESC)
FROM Audits
)
SELECT
LatestState = MAX(CASE rn WHEN 1 THEN State END),
LatestDate = MAX(CASE rn WHEN 1 THEN Date END),
PreviousState = MAX(CASE rn WHEN 2 THEN State END),
PreviousDate = MAX(CASE rn WHEN 2 THEN Date END)
FROM ranked
WHERE rn BETWEEN 1 AND 2
По сути, этот запрос использует условное агрегирование для отображения наивысшего ранга State
& Date
в качестве значений Latest
, а второго наивысшего ранжирования State
& Date
в качестве значений Previous
.
Полезное чтение: