【问题标题】:T-SQL select rows where [col] = MIN([col])T-SQL 选择 [col] = MIN([col]) 的行
【发布时间】:2021-05-06 12:25:23
【问题描述】:

我有一个由 UNION 查询生成的数据集,该查询聚合了来自 2 个来源的数据。

我想根据是否仅在这些来源中找到数据来选择该数据,或两者兼而有之。

集合的数据相关部分是这样的,还有很多其他的列:

row preference group position
1 1 111 1
2 1 111 2
3 1 111 3
4 1 135 1
5 1 135 2
6 1 135 3
7 2 111 1
8 2 135 1

[preference] 列与[group] 列相结合是我要过滤的内容,我想为每个[group] 返回具有与MIN([preference]) 相同[preference] 的所有行

根据上述数据,所需的输出将是第 1 -> 6 行

[preference] 列表示UNION 查询中数据的原始来源,因此合法数据集可能如下所示:

row preference group position
1 1 111 1
2 1 111 2
3 1 111 3
4 2 111 1
5 2 135 1

在这种情况下,所需的输出将是第 1、2、3 和 5 行

我想不通的是怎么做(不是真正的代码):

SELECT * WHERE [preference] = MIN([preference]) PARTITION BY [group]

【问题讨论】:

  • 您是否尝试使用像SELECT [group], min(preference) AS minPref FROM... GROUP BY [group] 这样的子查询,然后简单地对该子查询执行内部联接?

标签: sql-server tsql group-by


【解决方案1】:

一种方法是使用RANK

SELECT row
  , preference
  , [group]
  , position
FROM (  
   SELECT row
     , preference
     , [group]
     , position
     , RANK() OVER (PARTITION BY [group] ORDER BY preference) AS seq
   FROM t) t2
WHERE seq = 1

Demo here

【讨论】:

  • 我最终使用了DENSE_RANK(),但基本上这让我得到了我需要的解决方案。我知道我会缺少一些东西。
【解决方案2】:

应该通过简单的内部连接来实现:

SELECT t1.*
  FROM t AS t1
  INNER JOIN (SELECT [group], MIN(preference) AS preference
                FROM t
                GROUP BY [group]
              ) t2 ON t1.[group] = t2.[group]
                   AND t1.preference = t2.preference

【讨论】:

  • 这在正常情况下可以工作,但不幸的是我的数据集不是一个表,它实际上是一个更大查询中的子查询,并且依赖于之前的@987654323 中的OUTPUT @ - 简而言之,这很复杂。
猜你喜欢
  • 2011-11-20
  • 2014-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-06
  • 1970-01-01
  • 2016-07-31
  • 2016-10-25
相关资源
最近更新 更多