获取联接中的最后一个条目

我知道这个问题已经问了很多,但我似乎无法使我的查询正常工作。

我试图在查询中每个ID仅获得一行,如下所示:

SELECT a.id,b.name
FROM table1 a
LEFT JOIN table2 b ON a.key = b.key
WHERE a.Date = 
(SELECT MAX(a1.date) from table1 WHERE a1.primarykey = a.primarykey)
GROUP BY a.id,b.name

我不需要按b.name分组,因为我需要按id分组。

现在,我多次出现b.name,它重复了a.id,而我只希望a.id的最后日期对应的b.name。

有人能指出我这样做的正确方法吗?

谢谢

chengzhangba 回答:获取联接中的最后一个条目

我猜是这样的情况:

WHERE a1.primarykey = a.primarykey

应为:

WHERE a1.key = a.key

key不是table1的主键,因为如果您的意思是主键,那么就没有必要为主键搜索MAX(date),因为每个主键只有1个日期。
如果我没看错,请尝试使用row_number()

SELECT t.id,t.name
FROM (
  SELECT a.id,b.name,row_number() over (partition by a.key order by a.date desc) rn
  FROM table1 a LEFT JOIN table2 b 
  ON a.key = b.key
) t 
WHERE t.rn = 1
,

如果您要从group语句中删除b.name,则每个id将获得1行。

不确定是否要对a.id进行分组为什么要对b.name进行分组?

,

尝试一下:

SELECT a.id,b.name from (
SELECT a1.id,a1.key,rank() over(partition by a1.key order by a1.date desc) md FROM table1 a1 )a
LEFT JOIN table2 b ON a.key = b.key and a.md=1;

但我不明白-您需要按ID或密钥分组,请仔细检查

本文链接:https://www.f2er.com/2961995.html

大家都在问