通过 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
示例数据 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