1

最小値を持つ (from_id, to_id) と条件に一致するループのすべての組み合わせの結果が必要です。

基本的に、最小値を持つループが必要です。たとえば、A から B まで、最小値と loop_id が必要です。

テーブルには次のフィールドがあります。

value     from_id   to_id     loop_id
-------------------------------------

2.3         A         B          2

0.1         A         C          2

2.1         A         B          4

5.4         A         C          4

したがって、結果は次のようになります。

value     from_id   to_id     loop_id
-------------------------------------

2.1         A         B          4

0.1         A         C          2

私は次のことを試しました:

SELECT t.value, t.from_id, t.to_id,t.loop_id
FROM myresults t 
INNER JOIN (
     SELECT min(m.value), m.from_id, m.to_id, m.loop_id
     FROM myresults m where m.loop_id % 2 = 0
     GROUP BY m.from_id, m.to_id, m.loop_id
) x
   ON  (x.from_id = t.from_id and x.to_id=t.to_id and x.loop_id=t.loop_id )
   AND x.from_id = t.from_id and x.to_id=t.to_id and x.loop_id=t.loop_id

しかし、それはすべてのループを返しています。前もって感謝します!

4

2 に答える 2

2

私が問題を理解しているので、これはうまくいくでしょう:

SELECT  t.value, t.from_id, t.to_id, t.loop_id
FROM    MyResults t
        INNER JOIN
        (   SELECT  From_ID, To_ID, MIN(Value) [Value]
            FROM    MyResults
            WHERE   Loop_ID % 2 = 0
            GROUP BY From_ID, To_ID
        ) MinT
            ON MinT.From_ID = t.From_ID
            AND MinT.To_ID = t.To_ID
            AND MinT.Value = t.Value

ただし、From_IDとTo_IDの組み合わせに重複する値がある場合(例:

value     from_id   to_id     loop_id
-------------------------------------

0.1         A         B          2

0.1         A         B          4

これにより、両方の行が返されます。

SQL-Server 2005以降を使用していて、上記のように重複する行が必要な場合は、次を使用できます。

SELECT  Value, From_ID, To_ID, Loop_ID
FROM    (   SELECT  *, MIN(Value) OVER(PARTITION BY From_ID, To_ID) [MinValue]
            FROM    MyResults
        ) t
WHERE   Value = MinValue

重複する行が必要ない場合は、次を使用できます。

SELECT  Value, From_ID, To_ID, Loop_ID
FROM    (   SELECT  *, ROW_NUMBER() OVER(PARTITION BY From_ID, To_ID ORDER BY Value, Loop_ID) [RowNumber]
            FROM    MyResults
        ) t
WHERE   RowNumber = 1
于 2012-04-25T07:54:26.413 に答える
1

これをもっと簡単にできませんか?

SELECT
  from_id,
  to_id,
  MIN(value)
FROM
  myresults
WHERE
  loop_id % 2 = 0
GROUP BY
  from_id,
  to_id

あるいは、私は質問を誤解しているかもしれません。

編集: loop_id を含めるには

SELECT
  m2.from_id,
  m2.to_id,
  m2.value,
  m2.loop_id
FROM
  myresults m2 INNER JOIN
    (SELECT
      m1.from_id,
      m1.to_id,
      MIN(m1.value)
    FROM
      myresults m1
    WHERE
      m1.loop_id % 2 = 0
    GROUP BY
      m1.from_id,
      m1.to_id) minset
  ON
        m2.from_id = minset.from_id
    AND m2.to_id = minset.to_id
    AND m2.value = minset.value
于 2012-04-25T07:40:34.280 に答える