我的问题与此问题类似 - MySQL select 1 row from inner join
然而,它从来没有真正以我需要的方式回答。所以我想我会问。
我有一个表A(tableA),这个表在tableB中有一堆状态。新州一直在增加。
TableB有一个“State”列,它有一个TableA.Id的外键。该表B具有值和时间戳
我正在尝试获取一个查询,该查询将返回TableA中的所有值,并使用内部联接从tableB中获取这些行的LATEST'值'。最新的是最新的时间。
我知道如何在需要的地方进行内部连接,并且我知道如何订购表以恢复最新的“时间”行,但是我不知道如何将这两者放在一起并创建单个查询
我确定我必须在选择中选择一个,这很好。但是,我要避免的是将DataTable带回TableA的所有结果,并分别对tableB上的每个结果进行查询。
有什么想法吗?
编辑 - 我在这个问题上犯了一个错误,我在尝试实现其中一个答案时才真正注意到了。
我在TableA.id和TableB.proId之间有一个外键
表A - 'Id','名称' 表B - 'Id','proId','State','time'
我希望通过B上的连接返回TableA的所有值,以恢复最大时间的“状态”
答案 0 :(得分:1)
SELECT T.Id,
T.Name,
T.State
FROM
(
SELECT A.ID,
A.Name,
B.State,
ROW_NUMBER() OVER ( PARTITION BY A.ID ORDER BY B.Timestamp DESC) RowNumber
FROM Table_A A
INNER JOIN Table_B B on A.Id = B.ProdId
) T
WHERE T.RowNumber = 1
答案 1 :(得分:0)
假设给定状态没有重复的时间戳:
select table_a.*, foo.value as latest_value
from table_a left outer join (
-- selects the value for the given state w/ the max timestamp
select bar.*, table_b.value from (
-- selects the max timestamp for a given state
select state, max(timestamp)
from table_b
group by state
) bar
left outer join table_b on
table_b.state = bar.state and
table_b.timestamp = bar.timestamp
) foo
on foo.state = table_a.id
或者,您可以使用first_value
,这是一个不那么冗长但更加模糊的内容:
select table_a.*, foo.value as latest_value
from table_a left outer join (
select distinct state,
first_value(value) over (
partition by state order by timestamp desc
)
from table_b
) foo
on foo.state = table_a.id
答案 2 :(得分:0)
Select Table_A.*
From Table_A
LEFT JOIN
(Select State, max(timestamp)
From Table_B
Group BY State) b
ON Table_A.Sate = b.State