SQL中的最大和

SQL中的最大和,sql,subquery,sum,max,Sql,Subquery,Sum,Max,我有一个商店、商店内的部门以及每个部门的销售额的列表,就像在子查询中使用maxsales创建的那样,但这在这里并不十分重要,我不认为: toronto baskets 500 vancouver baskets 350 halifax baskets 100 toronto noodles 275 vancouver noodles 390 halifax noodles 120 halifax fish 200 我想问一下每家商店最畅销的部门。结果应该

我有一个商店、商店内的部门以及每个部门的销售额的列表,就像在子查询中使用maxsales创建的那样,但这在这里并不十分重要,我不认为:

toronto    baskets 500
vancouver  baskets 350
halifax    baskets 100
toronto    noodles 275
vancouver  noodles 390
halifax    noodles 120
halifax    fish    200
我想问一下每家商店最畅销的部门。结果应该如下所示:

toronto    baskets 500
vancouver  noodles 275
halifax    fish    200

每当我使用GROUPBY时,它都会包含子查询中的所有列表。在没有临时表的情况下,有没有一种干净的方法可以做到这一点?

这在Oracle中有效,其他实现可能有不同的分析函数语法,或者完全没有:

select store
     , max(department) keep(dense_rank last order by sales)
     , max(sales)
  from (
        ...query that generates your results...
       )
 group by store

从2005年起,这将在SQL Server中起作用:

with data as
(select store, department, sales
from <your query>),
 maxsales as
(select store,  sales = max(sales)
from data
group by store)
select store, (select top 1 department from data where store = t.store and sales = t.sales order by [your criteria for ties]), sales
from maxsales m

我假设在出现领带时,您只想显示一个部门,因此需要显示前1个部门和[您的领带标准]来区分它们。

也许这可以奏效。虽然还没有尝试过,但可能有更好的解决方案

select yourTable.store, dept, sales
from yourTable
join (
  select store, max(sales) as maxSales from yourTable group by store
) tempTable on tempTable.store = yourTable.store 
           and tempTable.maxSales = yourTable.sales

这在SQLServer2000及更高版本中确实有效

SELECT a.Store, a.Department, a.Sales
FROM temp a
INNER JOIN 
(SELECT store, max(sales) as sales
FROM temp
GROUP BY Store) b
ON a.Store = b.Store AND a.Sales = b.Sales;

这将在没有临时表的SQL Server中工作:

SELECT Store, Department, Sales FROM
(SELECT Store, Department, Sales,
DENSE_RANK()  OVER (PARTITION BY Store
ORDER BY Sales DESC) AS Dense_Rank
FROM Sales) A WHERE Dense_Rank = 1
其中Sales=您的原始查询

这将起作用

Select Store, Department, Sales
From yourTable A
Where Sales = (Select Max(Sales)
               From YourTable
               Where Store = A.Store)

下面是我的2个SQL 2005解决方案。如果两个销售数据相同,我目前看到的其他数据可能无法返回正确的数据。这取决于你的需要

第一个使用Row_Number函数,所有的行从最低到最高的销售额排列,然后是一些打破平局的规则。然后在每个商店中选择最高等级以获得结果

您可以尝试将Partion By子句添加到Row_Number函数see BOL和/或使用内部联接而不是in子句进行调查

第二,借鉴Turnkey的想法,再次对它们进行排序,但按存储分区,因此我们可以选择排名第一的一个。稠密的_秩可能会给两个相同的行提供相同的秩,因此如果store和department不是唯一的,它可能会返回两行。对于Row_编号,该编号在分区中是唯一的

需要注意的是,这可能很慢,但对于大多数数据集来说,这比其他解决方案中的子查询要快。在该解决方案中,查询必须每行运行一次,包括排序等,这可能会导致大量查询

其他查询选择每个门店的最大销售额并以这种方式返回数据,如果两个部门恰好有相同的销售额,则返回门店的重复行。最后一个查询显示了这一点

DECLARE @tbl as TABLE (store varchar(20), department varchar(20), sales int)

INSERT INTO @tbl VALUES ('Toronto', 'Baskets', 500)
INSERT INTO @tbl VALUES ('Toronto', 'Noodles', 500)
INSERT INTO @tbl VALUES ('Toronto', 'Fish', 300)
INSERT INTO @tbl VALUES ('Halifax', 'Fish', 300)
INSERT INTO @tbl VALUES ('Halifax', 'Baskets', 200)

-- Expect Toronto/Noodles/500 and Halifax/Fish/300

;WITH ranked AS -- Rank the rows by sales from 1 to x
(
    SELECT 
        ROW_NUMBER() OVER (ORDER BY sales, store, department) as 'rank', 
        store, department, sales
    FROM @tbl
)

SELECT store, department, sales
FROM ranked
WHERE rank in (
    SELECT max(rank) -- chose the highest ranked per store
    FROM ranked
    GROUP BY store
)

-- Another way
SELECT store, department, sales
FROM (
    SELECT 
        DENSE_RANK() OVER (PARTITION BY store ORDER BY sales desc, 
store desc, department desc) as 'rank',
        store, department, sales
    FROM @tbl
) tbl
WHERE rank = 1


-- This will bring back 2 rows for Toronto
select tbl.store, department, sales
from @tbl tbl
    join (
        select store, max(sales) as maxSales from @tbl group by store
    ) tempTable on tempTable.store = tbl.store 
           and tempTable.maxSales = tbl.sales

什么数据库平台?sql server?甲骨文?谁会想到面条会在温哥华如此受欢迎,嗯?又是挑赢家了。这个问题应该被锁定。是的,我本来打算提出这个问题,但我认为他在SQL Server上,就像任何使用oracle的人所指定的那样……哎呀,我晚了几分钟发布了一个类似的解决方案。这个查询不会按发布的方式运行。必须执行before group by,TESTERABLE中的maxsales没有名称,select中的列需要指定其来源。我不想直截了当,但如果有人后来来,我想说清楚。这个解决方案只适用于SQL 2005及以上版本。