我在SQLServer中有一个包含数百万行包含x,y,z坐标的表:
X Y Z
2660000 1270000 421.8513
2660000 1270000 -1415.6297
2660000 1269960 421.0372
2660000 1269960 -1415.7926
总有两行具有相同的x和y坐标。
我想获得一个具有以下结构的表: x , y , ztop (该对的z值越大), zbase (z值越低) 。因此,对于每对具有相同x,y坐标的结果,只包含一行。
我尝试了不同的方法但到目前为止没有成功。有没有人知道如何在C#或直接在SQL Server中解决这个问题?
答案 0 :(得分:1)
在Oracle中,如下所示,如果没有GROUP BY子句,聚合函数Max和MIN将应用于整个表,并将它们应用于x和y的每个唯一组合。
SELECT x, y, MAX(z), MIN(z) GROUP by x, y
答案 1 :(得分:0)
您需要使用MIN和MAX聚合函数来获取顶部和基本z值,然后按x和y列进行分组。
IF EXISTS ( SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'coords1' )
BEGIN
DROP TABLE dbo.coords1
END
GO
CREATE TABLE coords1 ( [x] DECIMAL(12,4), [y] DECIMAL(12,4), [z] DECIMAL(12,4) )
GO
INSERT INTO coords1 ( x, y, z)
VALUES(2660000, 1270000, 421.8513),
(2660000, 1270000, -1415.6297),
(2660000, 1269960, 421.0372),
(2660000, 1269960, -1415.7926)
GO
IF EXISTS ( SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'coords2' )
BEGIN
DROP TABLE dbo.coords2
END
GO
CREATE TABLE coords2 ( [x] DECIMAL(12,4), [y] DECIMAL(12,4), [ztop] DECIMAL(12,4), [zbase] DECIMAL(12,4) )
GO
INSERT INTO coords2 ([x], [y], [ztop], [zbase])
SELECT [x], [y], MAX([z]) AS [ztop], MIN([z]) AS [zbase]
FROM coords1
GROUP BY x, y
SELECT * FROM coords2