通过 id sql 服务器选择具有最大值 [col2] 的最小值 [col1] 的行

Selecting rows with minimal values [col1] of maximal values [col2] by id sql server

示例数据 MAIN_TABLE:

+-----+--------+-------+
| ID  | HEIGHT | STOCK |
+-----+--------+-------+
| ID1 |    180 |   680 |
| ID1 |    170 |   680 |
| ID1 |    130 |   360 |
| ID2 |    250 |   420 |
| ID2 |    190 |   420 |
| ID2 |     70 |   120 |
| ... |   ...  |  ...  |
+-----+--------+-------+

我需要 select 具有最大 STOCK 和最小 HEIGHT 的不同 ID 行。

期望的结果是:

+-----+--------+-------+
| ID  | HEIGHT | STOCK |
+-----+--------+-------+
| ID1 |    170 |   680 |
| ID2 |    190 |   420 |
| ... |   ...  |  ...  |
+-----+--------+-------+

我用来实现它的查询代码:

WITH MAX_STOCK (ID, maxstock) as
(
    select ID, max(STOCK) as maxstock
    from MAIN_TABLE
    group by ID
),
TABLE_STOCK (ID, HEIGHT, STOCK) AS
(
    select a.ID, a.HEIGHT, a.STOCK
    from MAIN_TABLE a join MAX_STOCK b
    on a.ID= b.ID and a.STOCK = b.maxstock
),
MIN_HEIGHT (ID, minheight) as
(
    select ID, min(HEIGHT) as minheight
    from TABLE_STOCK
    group by ID
),
TABLE_HEIGHT (ID, HEIGHT, STOCK) AS
(
    select a.ID, a.HEIGHT, a.STOCK
    from TABLE_STOCK a join MIN_HEIGHT b
    on a.ID= b.ID and a.HEIGHT = b.minheight
)

如果我 select 任何表格 MAX_STOCK、TABLE_STOCK、MIN_HEIGHT、

我在 1-2 秒内得到结果。

但是当 selecting TABLE_HEIGHT 时,这将是我想要的结果,

它正在执行 6 分钟以上,对 600 行的数据没有回答

我应该如何编写此查询才能在合理的时间内获得结果?

我认为您可以使用 window 函数来实现这一点。尝试以下示例。

create table #Main(
Id varchar(50),
HEIGHT int,
STOCK int
)

insert into #Main values('ID1',180,680),('ID1',170,680),('ID1',130,360 ),('ID2',250,420),('ID2',190,420),('ID2',70,120)

select * from (
select *,dense_rank() over(partition by Id order by STOCK desc,HEIGHT asc) as sira
from #Main
) k 
where sira=1