我有一个看起来像这样的表:
|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
看起来很简单,但分组很棘手。 有没有人有建议?
答案 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