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