C#/ SQLServer:按类似的列值合并表中的行

时间:2015-02-06 11:49:21

标签: c# sql-server

我在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中解决这个问题?

2 个答案:

答案 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