【问题标题】:how to select one row from several rows with minimum value如何从具有最小值的几行中选择一行
【发布时间】:2016-11-22 06:31:26
【问题描述】:

基于SQL query to select distinct row with minimum value的问题。 考虑表格:

id  game   point
1    x      1
1    y      10
1    z      1
2    x      2
2    y      5
2    z      8

使用来自上述问题的建议答案(选择点列中具有最小值的 id,按游戏分组)我们获得

id  game   point    
1    x      1
1    z      1
2    x      2  

问题是如何通过单个输出为每个 ID 获得答案。两个输出

id  game   point    
1    x      1
2    x      2 

id  game   point    
1    z      1
2    x      2 

可以接受。

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    使用row_number():

    select t.*
    from (select t.*,
                 row_number() over (partition by id order by point asc) as seqnum
          from t
         ) t
    where seqnum = 1;
    

    【讨论】:

    • 谢谢!精彩的。这对我来说是一个发现。
    • 如果我有一个额外的字段要分区...例如,filial。除了partition by cast(id as varchar(MAX)) + cast(filial as varchar(MAX)),还有更优雅的解决方案吗?
    • @VadimShkaberda 。 . . partition by id, filial order by . . . .
    • 感谢您的回答。奇怪的是partition by id, filial order by 在我第一次尝试时给了我一个错误。现在好了。
    【解决方案2】:

    我们假设所有点条目都是不同的(对于每个 id 和它的游戏,所以我们可以获得每个 id 与它的游戏的最小值),使用子查询和带有两个条件的内部连接会给你结果,re等待。如果它不适合你,我有另一个解决方案:

    SELECT yt.*,     
    FROM Yourtable yt INNER JOIN
        (
            SELECT ID, MIN(point) MinPoint
            FROM Yourtable
            GROUP BY ID
        ) t ON yt.ID = t.ID AND yt.Record_Date = yt.MinDate
    

    【讨论】:

      猜你喜欢
      • 2016-11-15
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 2017-12-17
      • 2013-12-30
      • 1970-01-01
      • 2019-08-05
      相关资源
      最近更新 更多