【问题标题】:Min function in SSMS on query with multiple columnsSSMS 中对多列查询的 Min 函数
【发布时间】:2017-12-02 07:14:05
【问题描述】:

在 MIN 函数中苦苦挣扎。需要抓取具有最小值的行上的其他值。换句话说,我有一个父项、一个子项和一个数量。我需要一个父项、子项和子项的数量。

Parent  Child   Value
A   AB  1
A   BC  2
A   CD  3
B   AB  4
B   BC  5
B   EE  6
C   AB  2
C   EE  4

查询应该作为结果返回

Parent  Child   Value
A   AB  1
B   AB  4
C   EE  4

AB 重复是可以的(因为它是 parent 唯一的)。我的 'group by' 不起作用,我怀疑我需要使用 over by 子句和可能的 partition by...

下面的 SQL 不能 100% 工作。我认为 Min_Qty 是正确的,但是 Child 是随机的,而不是隶属于 Qty 的孩子并且得到了太多的行结果。

SELECT  Parent,
        Child,
        MIN(Qty) OVER (PARTITION BY Child) AS Min_Qty
FROM #Temp
GROUP BY Parent, Child, Qty

【问题讨论】:

  • 既然您似乎知道 OVER() 函数,为什么不直接执行 ROW_NUMBER() OVER(PARTITION BY Child ORDER BY...)?
  • 不应该返回C AB 2而不是C EE 4
  • @SQLChao 是的,部分错误。对不起。很好的收获。

标签: sql sql-server group-by ssms min


【解决方案1】:

如前所述,您可以使用窗口函数并分配按数量排序的行号。然后得到所有 RowNum = 1。

RexTester Demo

;WITH cte AS (
SELECT 
    *
  , ROW_NUMBER() OVER (PARTITION BY Parent ORDER BY Qty ASC) AS RowNum 
FROM YourTable
)

SELECT
    Parent
  , Child
  , Qty
FROM cte WHERE rownum = 1

【讨论】:

  • 我能够适应这一点并放弃 min() 函数。感谢您的工作替代方案。我已经将其作为答案进行了检查,尽管它不是使用 min() 函数。
【解决方案2】:

你也可以做一个简单的自加入

declare @tmp table
(
parent char(1),
child char(2),
age smallint
);
insert into @tmp VALUES('A', 'AB', 1);
insert into @tmp VALUES('A', 'BC', 2);
insert into @tmp VALUES('A', 'CD', 3);
insert into @tmp VALUES('B', 'AB', 4);
insert into @tmp VALUES('B', 'BC', 5);
insert into @tmp VALUES('B', 'EE', 6);
insert into @tmp VALUES('C', 'AB', 6);
insert into @tmp VALUES('C', 'EE', 4);

SELECT t.parent, t.child, t.age from @tmp t INNER JOIN 
(SELECT parent, Min(age) as MinAge from @tmp GROUP BY parent)
g on g.parent = t.parent and g.minage = t.age

注意我已经更改了您的 c 的数据,以便选择 EE。使用您的数据,您也可以获得 C 的 AB!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-29
    • 2013-12-31
    • 2023-03-14
    • 2019-04-04
    • 1970-01-01
    • 1970-01-01
    • 2021-07-05
    • 1970-01-01
    相关资源
    最近更新 更多