【问题标题】:Getting the last entry within a join获取连接中的最后一个条目
【发布时间】:2020-03-31 14:08:58
【问题描述】:

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

我试图在查询中每个 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。

谁能指出正确的方法?

谢谢

【问题讨论】:

  • 要获得正确答案,您需要共享两个表中的示例数据以及您的预期结果(作为表格文本)。

标签: sql sql-server greatest-n-per-group


【解决方案1】:

我猜这个条件:

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

【讨论】:

  • 该死,我太傻了。将 a.primarykey 更改为 a.key 实际上解决了它。非常感谢!
【解决方案2】:

如果您要从 group 语句中删除 b.name,看起来每个 id 会得到 1 行。

如果您在 a.id 上分组,不确定为什么需要在 b.name 上分组?

【讨论】:

  • 从语句中删除 b.name 会给我一个错误“选择列表中的列无效,因为它既不包含在聚合函数或 GROUP BY 子句中。”
【解决方案3】:

试试这个:

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 或键分组,请仔细检查

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    • 2020-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-17
    相关资源
    最近更新 更多