0

好的,我代表一个表格中包含三列的矩阵。为简单起见:A、B 列和值。A 和 B 表示矩阵的 X 和 Y“坐标”。

有人可以帮我解决以下问题:

对于矩阵 (X) 中的每一列,我希望检索最小值和 Y 坐标字段,它表示 X 列中的最小值。

这是针对矩阵中的每一列/X。

我一直在苦苦挣扎,因为我不能在 group by 或聚合函数中包含 Y,所以它不会让我在与计算最小值相同的查询中返回它(X 是 GROUP BY'd)。

编辑如果有两行或更多行,则应返回最小 Y 值。

为了清楚起见,我的表格因此是:

是 | X | 价值

0 | 0 | 0.38

1 | 0 | 0.72

2 | 0 | 0.13

3 | 0 | 0.45

0 | 1 | 0.52

1 | 1 | 0.23

2 | 1 | 0.84

3 | 1 | 0.15

0 | 2 | 0.52

1 | 2 | 0.04

2 | 2 | 0.04

3 | 2 | 0.15

使用上述测试数据,它应该返回:

X | 是 | 价值

0 | 2 | 0.13

1 | 3 | 0.15

2 | 1 | 0.04

请注意 Y=2,第 1 行是最小的 Y,尽管第 2 行也有最小值。

4

5 回答 5

4
SELECT x
     , y
     , value
FROM
  ( SELECT x
         , y
         , ROW_NUMBER() OVER (PARTITION BY x ORDER BY Value, y) AS rn 
         , Value
    FROM tableX
  ) AS tmp
WHERE rn = 1 ;

您可以在以下位置对其进行测试:SQL-Fiddle
(已更正以反映问题中更改的数据:test-2

索引对(x, value, y)性能很有用。

于 2012-05-28T19:27:01.893 回答
2
SELECT  y ,
        ( SELECT    MIN(x)
          FROM      user997112 i
          WHERE     i.Y = o.y
                    AND i.VALUE = o.VALUE
        ) AS x ,
        value
FROM    ( SELECT    y ,
                    MIN(VALUE) AS value
          FROM      dbo.user997112
          GROUP BY  y
        ) AS o

这是我使用的架构

CREATE TABLE [dbo].[user997112](
    [x] [int] NULL,
    [y] [int] NULL,
    [VALUE] [decimal](5, 2) NULL
) 
GO
INSERT [dbo].[user997112] ([x], [y], [VALUE]) VALUES (0, 0, CAST(0.38 AS Decimal(5, 2)))
INSERT [dbo].[user997112] ([x], [y], [VALUE]) VALUES (1, 0, CAST(0.72 AS Decimal(5, 2)))
INSERT [dbo].[user997112] ([x], [y], [VALUE]) VALUES (2, 0, CAST(0.13 AS Decimal(5, 2)))
INSERT [dbo].[user997112] ([x], [y], [VALUE]) VALUES (3, 0, CAST(0.45 AS Decimal(5, 2)))
INSERT [dbo].[user997112] ([x], [y], [VALUE]) VALUES (0, 1, CAST(0.52 AS Decimal(5, 2)))
INSERT [dbo].[user997112] ([x], [y], [VALUE]) VALUES (1, 1, CAST(0.23 AS Decimal(5, 2)))
INSERT [dbo].[user997112] ([x], [y], [VALUE]) VALUES (2, 1, CAST(0.84 AS Decimal(5, 2)))
INSERT [dbo].[user997112] ([x], [y], [VALUE]) VALUES (3, 1, CAST(0.15 AS Decimal(5, 2)))
INSERT [dbo].[user997112] ([x], [y], [VALUE]) VALUES (0, 2, CAST(0.52 AS Decimal(5, 2)))
INSERT [dbo].[user997112] ([x], [y], [VALUE]) VALUES (1, 2, CAST(0.04 AS Decimal(5, 2)))
INSERT [dbo].[user997112] ([x], [y], [VALUE]) VALUES (2, 2, CAST(0.04 AS Decimal(5, 2)))
INSERT [dbo].[user997112] ([x], [y], [VALUE]) VALUES (3, 2, CAST(0.15 AS Decimal(5, 2)))
于 2012-05-28T19:19:32.447 回答
1

这是一种方法,但它很笨拙:

SELECT X, MIN(Y), Value 
FROM your_table fullTable   
WHERE Value <= ALL (SELECT Value FROM your_table WHERE X = fullTable.X)  
GROUP BY X, Value

如果您没有关于 Value 的索引,这可能会更高效。否则你可能会得到更好的性能

SELECT X, MIN(Y), Value   
FROM your_table fullTable   
WHERE Value = (SELECT MIN(Value) FROM your_table WHERE X = fullTable.X)  
GROUP BY X, Value
于 2012-05-28T19:26:00.283 回答
1

就像是

SELECT Test.X, Test.Y, MAX(Test.Value) AS Value FROM Test 
INNER JOIN (
SELECT DISTINCT X, MIN(Y) AS Y FROM Test
GROUP BY X) t 
ON Test.X = t.X AND Test.Y = t.Y 
GROUP BY Test.X, Test.Y

基本上:先做一个子查询,得到X与最小Y的组合,然后加入到原表中,得到对应的值

于 2012-05-28T19:29:42.497 回答
0

我希望我准时!

Select t1.A,
    min(t1.B),
    t1.value 
from `table` t1, 
 (SELECT MIN( value ) AS value, a
  FROM  `table` 
  GROUP BY (A)) `t2`
where t1.A = t2.A
group by (t1.a)

首先给你 A 的最小值,然后按 B 分组

于 2012-05-28T19:47:47.257 回答