0

わかりました。テーブルに3つの列がある行列を表しています。簡単にするために、列A、B、および値。AとBは、マトリックスのXとYの「座標」を表します。

誰かが私が次のことを解決するのを手伝ってくれませんか:

行列(X)の各列について、最小の値と、列Xのこの最小の値を表すY座標フィールドを取得したいと思います。

これは、マトリックス内の各列/X用です。

Yをgroupby関数または集計関数に含めることができなかったために苦労していました。そのため、最小値を計算するのと同じクエリでYを返すことができませんでした(XはGROUP BYされました)。

編集2つ以上の行がある場合は、最小のY値を返す必要があります。

したがって、明確にするために、私のテーブルは次のようになります。

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 | Y | 価値

0 | 2 | 0.13

1 | 3 | 0.15

2 | 1 | 0.04

Y = 2では、行2にも最小値がありますが、行1が最小のYであることに注意してください。

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

これを行う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 に答える