SSMS中的最小函数用于多列查询

时间:2017-06-28 19:07:55

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

使用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可以复制(因为它对父母来说是唯一的)。我的'group by'没有用,我怀疑我需要使用over 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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您也可以进行简单的自我加入

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是所选的。根据您的数据,您也可获得AB for C!