我想根据另一列获得一些列
示例表:
| BlilCode | BlilShortName | BatchWeigth | BillVersion | BlilMaxTime |
+----------+---------------+-------------+-------------+-------------+
| 5502 | aaa | 1.00 | 1 | 360 |
| 5502 | aaa | 2.00 | 2 | 240 |
| 5510 | bbb | -32.94 | 2 | 360 |
| 5510 | bbb | 1.00 | 1 | 360 |
| 5510 | bbb | 36.37 | 3 | 3600 |
但我想得到BillVersion
最大的行BlilCode
是最大的
预期结果
| BlilCode | BlilShortName | BatchWeigth | BillVersion | BlilMaxTime |
+----------+---------------+-------------+-------------+-------------+
| 5502 | aaa | 2.00 | 2 | 240 |
| 5510 | bbb | 36.37 | 3 | 3600 |
我目前的查询是:
SELECT
[BlilCode], [BlilShortName],
BatchWeigth, (BillVersion) AS BillVersion, [BlilMaxTime]
FROM
[CVfeedDB].[dbo].[constants.Blil]
WHERE
BlilActive = 1 AND BatchWeigth IS NOT NULL
ORDER BY
BlilCode
根据您的描述,我并不是很聪明,但是,可以使用以下查询获得结果
select your_table.*
from your_table
join
(
select BlilShortName, max(billversion) bmax
from your_table
group by BlilShortName
) t on your_table.billversion = t.bmax and your_table.BlilShortName = t.BlilShortName
根据我的经验,与row_number
始终使用顺序扫描的解决方案相比,在某些情况下它可以更快。
绩效奖金
由于有关于效率的讨论,我敢于添加简单的测试
IF OBJECT_ID('dbo.GTable', 'U') IS NOT NULL DROP TABLE dbo.GTable
SELECT TOP 1000000
NEWID() id,
ABS(CHECKSUM(NEWID())) % 100 group_id,
ABS(CHECKSUM(NEWID())) % 10000 orderby
INTO GTable
FROM sys.sysobjects
CROSS JOIN sys.all_columns
SET STATISTICS TIME on
-- GROUP BY version
select t1.*
from gtable t1
join
(
SELECT group_id, max(orderby) gmax
from gtable
group by group_id
) t2 on t1.group_id = t2.group_id and t1.orderby = t2.gmax
-- WINDOW FUNCTION version
select t.id, t.group_id, t.orderby
from
(
select *,
dense_rank() over (partition by group_id order by orderby desc) rn
from gtable
) t
where t.rn = 1
如果我在我的服务器上运行它,那么 GROUP BY 版本的性能比窗口函数版本好两倍多。此外,如果我创建索引
CREATE NONCLUSTERED INDEX ix_gtable_groupid_orderby
ON [dbo].[GTable] (group_id,orderby) INCLUDE (id)
那么性能甚至要好三倍以上,而窗口函数解决方案的性能相同,因为它使用顺序扫描,尽管有索引。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句