Условный совокупный запрос - PullRequest
2 голосов
/ 20 февраля 2012

У меня есть такая таблица:

OrderID | PhaseID | Timestamp
1       | 1       | 1/1
1       | 2       | 1/2
1       | 3       | 1/3
1       | 2       | 1/4
1       | 4       | 1/5

Я пытаюсь получить запрос на возврат самой последней отметки времени для каждой комбинации фазы заказа без меньшего значения фазы идентификатора. Примерно так:

OrderID | PhaseID | MaxTimestampWithoutBeingFollowedByLesserPhaseID
1       | 1       | 1/1
1       | 2       | 1/4
1       | 3       | NULL
1       | 4       | 1/5

Я продолжаю бегать кругами и сталкиваюсь с проблемой условного агрегатного запроса.

Кто-нибудь может выяснить вопрос или дать мне несколько указателей?

Ответы [ 2 ]

0 голосов
/ 21 февраля 2012
  1. Ранжировать фазы по временным меткам для каждого заказа.

  2. Присоединиться к каждой строке со своим преемником в зависимости от ранга.

  3. Отметьте строки, в которых за PhaseID следует меньшее PhaseID.

  4. Агрегируйте последний набор результатов, выбирая метки максимального времени, условно используя MAX(CASE ...), чтобы пропустить строки, помеченные какза ними следуют меньшие PhaseID.

Вот пример реализации:

;
WITH ranked AS (
  SELECT
    *,
    rnk = ROW_NUMBER() OVER (PARTITION BY OrderID ORDER BY [Timestamp])
  FROM atable
),
marked AS (
  SELECT
    r1.OrderID,
    r1.PhaseID,
    r1.[Timestamp],
    IsFollowedByLesserPhaseID = CASE WHEN r2.PhaseID IS NULL THEN 0 ELSE 1 END
  FROM ranked r1
    LEFT JOIN ranked r2 ON r1.OrderID = r2.OrderID
                       AND r1.rnk     = r2.rnk - 1
                       AND r1.PhaseID > r2.PhaseID
)
SELECT
  OrderID,
  PhaseID,
  MaxTimestampWithoutBeingFollowedByLesserPhaseID = MAX(
    CASE IsFollowedByLesserPhaseID WHEN 0 THEN [Timestamp] END
  )
FROM marked
GROUP BY
  OrderID,
  PhaseID
0 голосов
/ 20 февраля 2012
With a as (
Select OrderID, PhaseID, MaxTimestamp=max([Timestamp])
From orderphase op
Where not exists(select 1 from orderphase where PhaseID < op.PhaseID 
    and [Timstamp]> op.[Timestamp])
Group by OrderID, PhaseID
)
Select distinct o.Orderid, o.PhaseID, MaxTimestamp=a.MaxTimestamp
From orderphase o
Left join a on a.OrderID = o.OrderID and a.PhaseID=o.PhaseID

РЕДАКТИРОВАТЬ ref a.MaxTimestamp

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