SQL Server查询按分区选择最小值

SQL Server查询按分区选择最小值,sql,sql-server,Sql,Sql Server,我很难理解这个overselectpartitionbystatement。我读过,但不明白。使用以下各项的好处是什么: SELECT MIN(Field) OVER (PARTITION BY OtherField) as Value FROM MYTABLE 你能简要描述一下吗?你什么时候会用它?为什么?当您在(按其他字段划分)上编写类似的内容时,有什么好处和实现目标。此外,它的主要思想是按分区分组,而不减少所选表行的计数 一般来说,窗口函数将比连接/聚合解决方案更快。这是一个相当简单的情

我很难理解这个overselectpartitionbystatement。我读过,但不明白。使用以下各项的好处是什么:

SELECT MIN(Field) OVER (PARTITION BY OtherField) as Value
FROM MYTABLE
你能简要描述一下吗?你什么时候会用它?为什么?当您在(按其他字段划分)上编写类似的内容时,有什么好处和实现目标。此外,它的主要思想是按分区分组,而不减少所选表行的计数

一般来说,窗口函数将比连接/聚合解决方案更快。这是一个相当简单的情况,因此性能可能基本相同

让我举一个例子:

CREATE TABLE dbo.Duration     (startDate datetime2, endDate datetime2);

INSERT INTO dbo.Duration (startDate, endDate)  VALUES ('2007-05-06 16:42:09', '2007-05-07 11:10:08');  
INSERT INTO dbo.Duration (startDate, endDate)  VALUES ('2007-05-07 08:30:09', '2007-05-07 12:12:43');  
INSERT INTO dbo.Duration (startDate, endDate)  VALUES ('2007-05-07 11:35:09', '2007-05-07 17:13:39');  
INSERT INTO dbo.Duration (startDate, endDate)  VALUES ('2007-05-07 08:30:10', '2007-05-07 12:12:43');  
INSERT INTO dbo.Duration (startDate, endDate)  VALUES ('2007-05-07 08:30:11', '2007-05-07 12:12:43');  
INSERT INTO dbo.Duration (startDate, endDate)  VALUES ('2007-05-07 08:30:12', '2007-05-07 12:12:43');  
现在,我们可以按字段
EndDate
进行分区,并在EndDate`的分区中获得startDate
MIN()

SELECT 
MIN(dr.startDate)  OVER (PARTITION BY dr.endDate ) MinDateByPartitionOfEndDate
,  dr.endDate
FROM dbo.Duration dr
请特别注意
2007-05-07 12:12:43
及其值
2007-05-07 08:30:09.0000000
。因此,我们没有减少查询结果,而是通过所需字段得到每个分区的
MIN

输出:

MinDateByPartitionOfEndDate    endDate
2007-05-06 16:42:09.0000000    2007-05-07 11:10:08.0000000
2007-05-07 08:30:09.0000000    2007-05-07 12:12:43.0000000
2007-05-07 08:30:09.0000000    2007-05-07 12:12:43.0000000
2007-05-07 08:30:09.0000000    2007-05-07 12:12:43.0000000
2007-05-07 08:30:09.0000000    2007-05-07 12:12:43.0000000
2007-05-07 11:35:09.0000000    2007-05-07 17:13:39.0000000
2007-05-07 11:35:09.0000000    2007-05-07 17:13:39.0000000
MinDateByGroupBy                    endDate
2007-05-06 16:42:09.0000000     2007-05-07 11:10:08.0000000
2007-05-07 08:30:09.0000000     2007-05-07 12:12:43.0000000
2007-05-07 11:35:09.0000000     2007-05-07 17:13:39.0000000
分组依据
(它减少了查询结果)查询,以查看
分组依据
分区依据
之间的主要区别:

SELECT 
MIN(dr.startDate) MinDateByGroupBy
,  dr.endDate
FROM dbo.Duration dr
GROUP BY dr.endDate
输出:

MinDateByPartitionOfEndDate    endDate
2007-05-06 16:42:09.0000000    2007-05-07 11:10:08.0000000
2007-05-07 08:30:09.0000000    2007-05-07 12:12:43.0000000
2007-05-07 08:30:09.0000000    2007-05-07 12:12:43.0000000
2007-05-07 08:30:09.0000000    2007-05-07 12:12:43.0000000
2007-05-07 08:30:09.0000000    2007-05-07 12:12:43.0000000
2007-05-07 11:35:09.0000000    2007-05-07 17:13:39.0000000
2007-05-07 11:35:09.0000000    2007-05-07 17:13:39.0000000
MinDateByGroupBy                    endDate
2007-05-06 16:42:09.0000000     2007-05-07 11:10:08.0000000
2007-05-07 08:30:09.0000000     2007-05-07 12:12:43.0000000
2007-05-07 11:35:09.0000000     2007-05-07 17:13:39.0000000

您能提供一些示例数据并期望结果吗?投票结束的范围太广。发布时,它对IMO没有什么好处。Stepp发布了一个很好的解释,但使用了不同的上下文-请注意该示例中的另一列,它使查询变得有用。