从 SQL Server 同表中选择对应的行

冥河

我想根据另一列获得一些列

示例表:

| 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
我为 Bac 工作

根据您的描述,我并不是很聪明,但是,可以使用以下查询获得结果

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从SQL Server表中选择备用行

来自分类Dev

SQL Server:从多个表中选择查询

来自分类Dev

在SQL Server中从表中选择XML

来自分类Dev

SQL Server从3个表中选择

来自分类Dev

如何从 SQL 表中选择特定行并在 SQL Server 中连接多个表?

来自分类Dev

在SQL Server中选择中间行

来自分类Dev

SQL Server:从每秒中选择行

来自分类Dev

在SQL Server中选择N行

来自分类Dev

如何在SQL Server的表的所有列中选择具有空值的行?

来自分类Dev

从SQL Server中的1:n表中选择不同的重复行

来自分类Dev

SQL Server - 如何从不同的行但在同一个表中选择值

来自分类Dev

如何根据sql server中行的列值从表中选择行

来自分类Dev

SQL Server - 在派生表中选择一列中计数 > 1 的行

来自分类Dev

SQL Server,从不同表的2列中选择

来自分类Dev

F#从SQL Server表同义词中选择

来自分类Dev

sql server从表中选择*列表中的列

来自分类Dev

如何从两个表SQL Server中选择列

来自分类Dev

SQL Server,从不同表的2列中选择

来自分类Dev

sql server从两个表中选择null或value

来自分类Dev

如何从SQL Server中的表中选择别名?

来自分类Dev

从 SQL Server 中的表中选择除了重复记录

来自分类Dev

如何仅在SQL Server中选择UNCOMMITTED行?

来自分类Dev

如何在SQL Server中选择行到列

来自分类Dev

如何在SQL Server中选择行到列

来自分类Dev

在SQL Server中选择具有多个行条件的记录

来自分类Dev

在 SQL Server 中选择行作为不同的列

来自分类Dev

如何从表中选择一列,并根据SQL Server中该列中的值获得第n行?

来自分类Dev

在选择查询Sql Server中选择列

来自分类Dev

在选择查询Sql Server中选择列

Related 相关文章

热门标签

归档