SQL查询以获取具有最小量项的bin

时间:2016-02-19 21:38:57

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

我有一个看起来像这样的表:

|Bin    |Item       |Amnt
|-------|-----------|----
|01SIS  |BA0001-BLK |7
|01A1   |BA0001-BLK |1
|01SIS  |BA0001-KAK |1
|01A1   |BA0001-KAK |5

我希望得到每个项目数量最少的Bin,如下所示:

|Bin    |Item       |Amnt
|-------|-----------|----
|01A1   |BA0001-BLK |1
|01SIS  |BA0001-KAK |1

看起来很简单,但分组很棘手。 有没有人有建议?

6 个答案:

答案 0 :(得分:1)

您希望获得每个项目的最低编号作为第一步。

SELECT Item, MIN(Amnt) AS Amnt
INTO #MinCounts
FROM Table
GROUP BY Item

知道了,然后您将该数据集内部连接到原始表,以消除任何与您的最小计数不匹配的项目。

SELECT *
FROM Table T
INNER JOIN #MinCounts MC
ON MC.Item = MC.Item
AND MC.Amnt = T.Amnt

如果"最小"这将给你重复。号码匹配多个项目。

答案 1 :(得分:1)

尝试这样的事情:

config.addPipelineStep('authorize', AuthRouterPipelineStep);
config.addPipelineStep('authorize', AnotherAuthRouterPipelineStep);

答案 2 :(得分:1)

返回多个记录的高效版本

我将假设您至少使用SQL Server 2008及更高版本。 我相信我的版本应该非常高效,具体取决于您返回大量数据的索引。这可以通过按 Amnt 对每个 Bin 进行排名,然后选择最低的 Amnt

SELECT *
FROM
(
    SELECT *,AmntRank = ROW_NUMBER() OVER (PARTITION BY Bin ORDER BY Amnt) 
    FROM YourTable
) AS A
WHERE AmntRank = 1 /*Only select lowest Amount for each Bin*/

答案 3 :(得分:0)

您可以使用CROSS APPLY结合DISTINCT获取每个bin的最小值,以删除重复项:

SELECT DISTINCT
       Bin ,
       details.Item ,
       details.Amt
FROM dbo.Data do
CROSS APPLY ( SELECT TOP 1
                         Amt,
                         Item
                  FROM    dbo.Data di
                  WHERE   di.Bin = do.Bin
                  ORDER BY  AMT DESC
            ) details

答案 4 :(得分:0)

这个小组应该工作

SELECT DISTINCT
       Bin ,
       Item ,
       Amt
FROM YourTable do
INNER JOIN (SELECT Bin. MIN(Amnt)Amt FROM YourTable GROUP BY Bin) Tmp
On Tmp.Bin = do.Bin and details.Amt = Tmp.Amt

答案 5 :(得分:0)

;with mytable as
(
  select '01SIS' as Bin, 'BA0001-BLK' as Item, 7 as Amnt
  union all
  select '01A1'   , 'BA0001-BLK', 1
  union all
  select '01SIS'  , 'BA0001-KAK', 1
  union all
  select '01A1'   , 'BA0001-KAK', 5
)
select top 1 with ties *
from mytable
order by Amnt asc