我使用mysql作为dbms,并且在尝试仅显示来自2个表的最新数据时遇到问题。 我有tbl_A
wid date val
-----------------------------
atjeh 11 Jan 2018 230
banda 22 Jan 2018 113
atjeh 20 Jan 2018 266
cirebon 21 Jan 2018 130
cirebon 09 Jan 2018 144
我有tbl_B
lid wid
-------------
5500 atjeh
5501 cirebon
5502 banda
我想像这样加入这些表:
wid lid date val
-------------------------------------------
atjeh 5500 20 Jan 2018 266
banda 5502 22 Jan 2018 133
cirebon 5501 21 Jan 2018 130
我试过这个:
SELECT tbl_A.wid, tbl_B.lid, MAX(tbl_A.date), tbl_A.val
FROM tbl_A
JOIN tbl_B ON tbl_B.wid = tbl_A.wid
GROUP BY tbl_B.witel
但是输出只选择最新日期:
wid lid date val
-------------------------------------------
atjeh 5500 20 Jan 2018 230 ---> should be 266
banda 5502 22 Jan 2018 133
cirebon 5501 21 Jan 2018 144 ---> should be 130
我该怎么做才能解决这个问题?谢谢。
答案 0 :(得分:1)
您需要有一个子查询,为每个Date
获取最新的wid
,然后再次将表连接到自身以获取所需的所有列。
SELECT b.lid, b.wid,
a.date, a.val
FROM tbl_B b
INNER JOIN tbl_a a
ON b.wid = a.wid
INNER JOIN
(
SELECT wid, MAX(Date) AS Date
FROM tbl_a a
GROUp BY wid
) c
ON c.wid = a.wid
AND c.Date = a.Date
这里是Demo。
答案 1 :(得分:0)
我已经形成了一个可以解决您问题的查询。而不是使用组函数我使用分析函数来解决这个问题,因为性能会更好。除了将date列更改为col_date之外,我使用了相同的表名和列名。(Oracle不允许我创建名为“date”的列,因为它是关键字)。当您使用此查询时,只需将“col_date”列更改为“date”,即可开始使用。
代码:
select
wid,
lid,
col_date,
val from (
SELECT
tbl_a.wid as wid,
tbl_b.lid as lid,
tbl_a.col_date as col_date,
tbl_a.val val,
max(tbl_A.col_date) over(partition by tbl_A.wid order by null) as max_date
FROM
tbl_a
JOIN tbl_b ON tbl_b.wid = tbl_a.wid) where max_date=COL_DATE;
希望这有帮助。
由于 ANKIT
答案 2 :(得分:0)
尝试此查询!
SELECT
a.wid AS wid ,
b.lid AS lid ,
MAX(a.date) AS date ,
MAX(a.val) AS val
FROM
tbl_A a ,
tbl_B b
WHERE
a.wid = b.wid
GROUP BY
a.wid