2

谁能帮我查询,我有表

vendorid, agreementid, sales

12001      1004         700
5291       1004         20576
7596       1004         1908
45         103           345
41         103           9087

目标是什么?当agreemtneid >1 然后显示销售量最高时的数据

vendorid  agreementid   sales
5291      1004          20576
41        103           9087

有任何想法吗 ?谢谢

4

4 回答 4

4

好吧,您可以尝试使用CTEROW_NUMBER之类的

;WITH Vals AS (
    SELECT *, ROW_NUMBER() OVER(PARTITION BY AgreementID ORDER BY Sales DESC) RowID
    FROM MyTable
    WHERE AgreementID > 1
)
SELECT *
FROM Vals
WHERE RowID = 1

这将避免您返回具有相同销售的多条记录。

如果没关系,你可以尝试类似

SELECT *
FROM MyTable mt INNER JOIN
(
    SELECT AgreementID, MAX(Sales) MaxSales 
    FROM MyTable
    WHERE AgreementID > 1
) MaxVals ON mt.AgreementID = MaxVals.AgreementID AND mt.Sales = MaxVals.MaxSales
于 2013-09-06T09:10:36.957 回答
1
SELECT TOP 1 WITH TIES *
FROM MyTable
ORDER BY DENSE_RANK() OVER(PARTITION BY agreementid ORDER BY SIGN (SIGN (agreementid - 2) + 1) * sales DESC)

解释

  1. 我们将表 MyTable 划分为agreementid.
  2. 对于每个分区,我们构建一个排名或其行。
  3. 如果agreementid大于 1 排名将等于ORDER BY sales DESC。否则分区中每一行的排名将相同:ORDER BY 0 DESC.

看看它的样子:

SELECT *
    , SIGN (SIGN (agreementid - 2) + 1) * sales AS x
    , DENSE_RANK() OVER(PARTITION BY agreementid ORDER BY SIGN (SIGN (agreementid - 2) + 1) * sales DESC) AS rnk
FROM MyTable

+----------+-------------+-------+-------+-----+
| vendorid | agreementid | sales | x     | rnk |
+----------|-------------|-------+-------+-----+
|  0       | 0           | 3     | 0     | 1   |
| -1       | 0           | 7     | 0     | 1   |
|  0       | 1           | 3     | 0     | 1   |
| -1       | 1           | 7     | 0     | 1   |
|  41      | 103         | 9087  | 9087  | 1   |
|  45      | 103         | 345   | 345   | 2   |
|  5291    | 1004        | 20576 | 20576 | 1   |
|  7596    | 1004        | 1908  | 1908  | 2   |
|  12001   | 1004        | 700   | 700   | 3   |
+----------+-------------+-------+-------+-----+

然后使用TOP 1 WITH TIES构造,我们只留下rnk等于 1 的行。

于 2013-09-06T09:53:20.050 回答
0

我真的不知道协议 ID > 1 背后的业务逻辑。在我看来,无论供应商 ID 是什么,您都希望通过协议 ID 获得最大销售额(有关系)。

首先,让我们创建一个简单的示例数据库。

-- Sample table
create table #sales
(
  vendor_id int,
  agreement_id int,
  sales_amt money
);

-- Sample data
insert into #sales values
(12001, 1004, 700),
(5291, 1004, 20576),
(7596, 1004, 1908),
(45, 103, 345),
(41, 103, 9087);

其次,让我们使用一个公共表表达式来解决这个问题,以获得一个结果集,该结果集的每一行都与按协议 ID 的最大销售额配对。

select 语句只是应用业务逻辑来过滤数据以获得您的答案。

-- CTE = max sales for each agreement id
;
with cte_sales as
(
  select
    vendor_id,
    agreement_id,
    sales_amt,
    max(sales_amt) OVER(PARTITION BY agreement_id) AS max_sales
  from
    #sales
)

-- Filter by your business logic
select * from cte_sales where sales_amt = max_sales and agreement_id > 1;

下面的屏幕截图显示了您想要的确切结果。

在此处输入图像描述

于 2013-09-06T12:41:59.687 回答
0

你可以试试这样。

SELECT TOP 1 sales FROM MyTable WHERE agreemtneid > 1 ORDER BY sales DESC
于 2013-09-06T09:16:08.213 回答