как добавить столбец в SQL Query, который вкл. LEFT OUTER JOIN

голоса
1

У меня есть этот запрос:

   SELECT p.ProductName, 
          dt.MaxTimeStamp, 
          p.Responsible
     FROM Product p
LEFT JOIN (SELECT ProductID, MAX(TimeStamp) AS MaxTimeStamp
             FROM StateLog
            WHERE State = 0
         GROUP BY ProductID, State) dt ON p.ProductID = dt.ProductID 
ORDER BY p.ProductName;

Он работает, как и должно быть, но теперь мне нужно выбрать «государство» тоже.

Хитрость в том, что я хочу только Lastest «TimeStamp», где «государство» было ложным. Но теперь мне нужно «государство» для Lastest «TimeStamp».

Я попытался это:

   SELECT p.ProductName, dt.State, dt.MaxTimeStamp, p.Responsible
     FROM Product p
LEFT JOIN (SELECT ProductID, MAX(TimeStamp) AS MaxTimeStamp, State
             FROM StateLog
            WHERE State = 0
         GROUP BY ProductID, State) dt ON p.ProductID =dt.ProductID 
ORDER BY p.ProductName;

Но это не сработало, потому что он дал мне «государство» для Lastest «TimeStamp».

Поэтому я надеюсь, что есть некоторые умные головы, которые там могут помочь мне. Я предполагаю, что это либо очень простым или очень трудно решить.

Задан 26/05/2010 в 23:24
пользователем
На других языках...                            


3 ответов

голоса
0

Большая работа форматирования по tvanfosson и OMG Ponies.

При использовании GROUP BYкаждый столбец должен либо:
1. Иметь агрегатная функция применяется к нему, или
2. Появляются в GROUP BYстатье.

Я не знаю , что Statusэто, но я предполагаю , что вам это нужно.
Так что это пример того , как ваш запрос должен выглядеть:

   SELECT p.ProductName, dt.State, dt.MaxTimeStamp, p.Responsible
     FROM Product p
LEFT JOIN (SELECT ProductID, Status, 
                  MAX(State) as State, MAX(TimeStamp) AS MaxTimeStamp
             FROM StateLog
            WHERE State = 0
         GROUP BY ProductID, Status) dt ON p.ProductID = dt.ProductID 
ORDER BY p.ProductName;

Но все это глупость , потому что, как уже говорилось в комментарии, вы фильтровать State = 0так что нет никакой возможности , что ваш запрос будет возвращать что - нибудь другое , чем 0 для государства.

Ответил 27/05/2010 в 00:10
источник пользователем

голоса
1

Пытаясь расшифровать то, что вы ищете, но между строк это могло быть суммированы следующим образом:

1) Самые последние StateLog.Timestamp где государство ноль

2) Состояние самого последнего StateLog.Timestamp

В этом случае следующее (довольно уродливый) запрос вероятно, будет работать. Вступил на столбец «Статус» в вашей группе была опечатка «государства», как его не возвращается в любом месте.

SELECT
    p.ProductName
    , sl.State AS StateWithLatestTimeStamp
    , MAX(CASE WHEN dt1.State = 0 THEN dt1.MaxTimeStamp ELSE NULL END) AS LatestStateZeroTimeStamp
FROM
    (
    SELECT
        ProductID
        , State
        , MAX(TimeStamp) AS MaxTimeStamp
    FROM
        StateLog
    GROUP BY
        ProductId
        , State
    ) dt1
INNER JOIN
    StateLog sl
ON  sl.ProductID = dt1.ProductID
INNER JOIN
    Product p
ON  p.ProductID = sl.ProductID
GROUP BY
    p.ProductName
    , sl.State
    , sl.TimeStamp
HAVING
    sl.TimeStamp = MAX(dt1.MaxTimeStamp)
Ответил 27/05/2010 в 01:05
источник пользователем

голоса
0
 with cte(Productid,TimeStamp,State,Status)  as
(select productid,TimeStamp,State,status,
max(timestamp) over (partition by productid,status) as max1
from statelog
)

 SELECT p.ProductName, 
          dt.MaxTimeStamp, 
          p.Responsible
     FROM Product p
LEFT JOIN(
select productid,max(case when state=0 then TimeStamp else null end) as MaxTimeStamp,
max(case when Timestamp=max1 then state else null end) as MaxState,
from statelog
group by productid,status)
dt ON p.ProductID = dt.ProductID 
ORDER BY p.ProductName;

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

Ответил 27/05/2010 в 01:17
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more