Несколько столбцов для ключевого слова AS и следующей последней строки - PullRequest
1 голос
/ 14 июля 2011

У меня есть ряд строк, чьи проверки хранятся в отдельной таблице.Используя один выбор, я хочу получить LatestState, LatestDate, PreviousState и PreviousDate.Честно говоря, я не знаю, с чего начать формулировку запроса T-SQL для этого, но я предполагаю, что мне нужно сделать два подзапроса внутри кода SELECT (псевдо- псевдо )):

SELECT 
   (SELECT [State], [Date] FROM Audits WHERE HighestID) AS ([LatestState], [LatestDate])
   (SELECT [State], [Date] FROM Audits WHERE NextHighestID) AS ([PreviousState], [PreviousDate])
FROM [Data]

Возможно ли это?Спасибо!

РЕДАКТИРОВАТЬ Я решил это с помощью объединений:

SELECT ps1.Rating, ps1.DatePerformed, ps2.Rating AS PreviousRating, ps2.DatePerformed AS PreviousDate
FROM [Data]
LEFT JOIN [Audit] ps1 ON ps1.[ID] = (SELECT MAX(ID) FROM [Audit] WHERE [ProjectID] = p.[ProjectID])
LEFT JOIN [Audit] ps2 ON ps2.[ID] = (SELECT MAX(ID) FROM [Audit] WHERE [ProjectID] = p.[ProjectID] AND ID < ps1.ID)

Спасибо за ваш вклад!

Ответы [ 2 ]

2 голосов
/ 14 июля 2011

Нельзя назначить набор псевдонимов для набора столбцов, подобных этому, поскольку подзапросу в списке 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.

Полезное чтение:

2 голосов
/ 14 июля 2011

Это даст вам информацию в два ряда.Первая строка - latest, а вторая строка - previous:).

select top (2) [State], [Date]
from Audits
order by ID desc

Если вы хотите, чтобы они были в одном ряду, вы можете попробовать это.

;with cte as
(
  select top 2 [State], [Date], row_number() over(order by ID desc) as rn
  from @Audits
)
select C1.State as LatestState,
       C1.Date as LatestDate,
       C2.State as PreviousState,
       C2.Date as PreviousDate
from cte as C1
  cross join cte as C2
where C1.rn = 1 and C2.rn = 2  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...