Sql query to return one single record per each combination in a table

前端 未结 2 791
被撕碎了的回忆
被撕碎了的回忆 2021-01-25 13:37

I need the result for every combination of (from_id, to_id) which has the minimun value and the loop matching a criteria.

So basically I need the loop that has the minim

相关标签:
2条回答
  • 2021-01-25 13:58

    Can't you do this a lot more simply?

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

    Or maybe I'm misunderstanding the question.

    EDIT: To include 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
    
    0 讨论(0)
  • 2021-01-25 14:02

    As I understand the problem this will work:

    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
    

    However, if you had duplicate values for a From_ID and To_ID combination e.g.

    value     from_id   to_id     loop_id
    -------------------------------------
    
    0.1         A         B          2
    
    0.1         A         B          4
    

    This would return both rows.

    If you are using SQL-Server 2005 or later and you want the duplicate rows as stated above you could use:

    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
    

    If you did not want the duplicate rows you could use this:

    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
    
    0 讨论(0)
提交回复
热议问题