如何在SQL查询中添加列, LEFT OUTER JOIN
我有这个疑问:如何在SQL查询中添加列, LEFT OUTER JOIN
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;
它的工作原理像它应该,但现在我需要选择“国家”出来了。
棘手的部分是,我只想要最新的“时间戳”,其中“状态”为假。 但现在我还需要最新的“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;
但它没有工作,因为它给我的“国家”,为最新的“时间戳”。
所以我希望有一些聪明的头脑可以帮助我。我猜测这要么很简单,要么很难解决。
挣扎破译你在找什么,但字里行间可以把它概括为:
1)最近StateLog.Timestamp其中国家是最近StateLog零
2)国家。时间戳
在这种情况下,以下(相当丑陋)的查询可能会起作用。假设你的团队中的'状态'栏是'State'的错字,因为它没有返回到任何地方。
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)
Thx,它没有改变任何东西。 我喜欢描述目标的简短方式,我从现在开始做。 你的Assumsion是正确的,正如我在评论中提到的那样。 – radbyx 2010-05-27 08:19:18
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以外。
状态和状态是一样的,对不起我的坏。 – radbyx 2010-05-27 11:12:38
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;
我想知道如果你的逻辑是有点糊涂。我看你是按状态分组,但你不使用状态的任何地方。 我无法测试这一点,但如果您发布表创建脚本和数据填充脚本,我们可以快速测试它。
状态和状态是一样的,对不起我的坏。 – radbyx 2010-05-27 11:12:04
Thx为我编辑它tvanfosson。下次我会尽力让自己变得更好。 – radbyx 2010-05-27 00:31:03
但您过滤'state = 0',所以状态将始终为0 ... – 2010-05-27 00:31:44
@radbyx - 使用0101按钮或缩进代码样本4个空格。你也可以使用反引号''''来排列格式。 – tvanfosson 2010-05-27 00:32:44