【问题标题】:Select primary key where max value in group clase SQL Server选择主键,其中组类 SQL Server 中的最大值
【发布时间】:2015-10-14 18:35:30
【问题描述】:

如何在 grouping by 子句中选择一个主键,它会从另一个不在 group by 子句中的表中返回最大值?例如:

表 A:

ID table_b_id Value
1  1          100
2  1          200
3  1          150
4  2          300
5  2          200
6  2          100
7  3          100
8  3          200

表 B

ID Name
1  A
2  B
3  C

预期结果

B.ID B.姓名 A.ID 1 一个 2 2 乙 4 3 C 8

我尝试过一些这样的查询:

select b.id, max(b.name), max(a.id) as kd_rec
from table_a a join table_b
on a.table_b_id = b.id
group by b.id

我不知道如何通过 b 从表 a 组中获取最大值。

【问题讨论】:

  • 您确实意识到您需要的结果中未使用表 B,对吧?
  • @AMIT :对不起,为了便于理解,重新创建了表格。实际上表和连接比这更复杂,连接大约 6 个表,并且该表中需要一些我没有包含在查询中的信息。我只是想知道如何进行该查询,您可以将其设为select b.id,max(b.name), max(a.id) as kd_rec

标签: sql-server


【解决方案1】:

如果你不想要来自tableBName,那么

查询

;with cte as
(
  select rn=row_number() over
  (
    partition by table_b_id
    order by [Value] desc
  ),*
  from tableA
)
select table_b_id as [B.ID],
ID as [A.ID]
from cte 
where rn=1;

Fiddle demo

如果您希望Name 也在结果集中,那么

查询

;with cte as
(
  select rn=row_number() over
  (
    partition by table_b_id
    order by [Value] desc
  ),*
  from tableA
)
select t1.table_b_id as [B.ID],
t2.Name as [B.Name],
t1.ID as [A.ID]
from cte t1
join tableB t2
on t1.table_b_id=t2.ID
where t1.rn=1;

Fiddle demo

【讨论】:

  • 对不起兄弟,这是with cte as 用于创建临时表吗?
  • 它是一个临时结果集。
  • 我觉得查询慢了大约 6 倍兄弟,但这可以完成工作。我可以做些什么来优化这个?顺便说一句,我会标记你的答案。
  • @ColourDalnet 执行此操作的另一个选项是使用外部应用,如下所示:“外部应用(从 tableA a 中选择 top 1 * a.id = b.id order by value desc) ”。不知道它是否会在您的实际情况下表现更好。
猜你喜欢
  • 2013-05-26
  • 2014-04-22
  • 1970-01-01
  • 1970-01-01
  • 2012-09-26
  • 2017-08-11
  • 2022-11-13
  • 2011-09-21
  • 2015-09-07
相关资源
最近更新 更多