sql - 如何从按不同项目分组的结果集中计算最大(列)行

标签 sql database sql-server-2008

SELECT T1.* FROM 
(
    SELECT
        MAX(no_of_orders)   [no_of_orders], 
        ord.customer_id     [customer_id], 
        ord_dtl.item_id     [item_id]
    FROM order_main ord
    INNER JOIN order_detail ord_dtl
        ON ord.order_id = ord_dtl.order_id      
    GROUP BY 
        ord.customer_id, ord_dtl.item_id
) T1    
INNER JOIN 
(
    SELECT
        MAX(no_of_orders) [no_of_orders], 
        ord.customer_id
    FROM order_main ord
    INNER JOIN order_detail ord_dtl
        ON ord.order_id = ord_dtl.order_id
    GROUP BY 
        ord.customer_id
) T2
ON 
    T1.customer_id = T2.customer_id
    AND T1.no_of_orders = T2.no_of_orders

我从表 order_main 和 order_detail 中计算出客户订购最多的商品。

我所做的就像我计算了按客户 ID 和商品 ID 分组的订单数量,并将结果集减少为客户订购最多的商品,我通过相同的查询加入了结果集,删除了按商品 ID 的分组。

我觉得这不是一个好的查询。

还有更好的选择吗?

SQL Fiddle

最佳答案

客户订购最多的商品

查询:

SQLFIDDLEExample

SELECT a.no_of_orders,
       a.customer_id,
       a.item_id
FROM (SELECT
        MAX(no_of_orders)   [no_of_orders], 
        ord.customer_id     [customer_id], 
        ord_dtl.item_id     [item_id],
    ROW_NUMBER() OVER(PARTITION BY ord.customer_id  ORDER BY MAX(no_of_orders) DESC) AS rnk
    FROM order_main ord
    INNER JOIN order_detail ord_dtl
        ON ord.order_id = ord_dtl.order_id      
    GROUP BY 
        ord.customer_id, ord_dtl.item_id) a
WHERE a.rnk = 1

结果:

| NO_OF_ORDERS | CUSTOMER_ID | ITEM_ID |
---------------|-------------|---------|
|           20 |           2 |       6 |
|           50 |           7 |       6 |
|         1500 |           8 |       7 |
|           10 |           9 |       3 |

关于sql - 如何从按不同项目分组的结果集中计算最大(列)行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18510728/

相关文章:

database - 从数据库获取数据并填充数组的Golang抽象函数

php:如果数据库中的字段不为空,则显示 html

sql-server - 在 View 中使用动态透视 SQL

sql - 如何在 oracle 11g 中授予对触发器和同义词的权限

sql - 使用子查询模拟 ROW_NUMBER、RANK 和 DENSE_RANK

mysql - 这个表中的数据是多余的吗?

sql - 当我不想使用聚合时,是否应该使用 Pivot 将 SQL Server 2008 行值转换为列名?

sql - Foxpro 哪里的表达式无效?

database - 关于 SSDT 开发过程的提示和关于自动化单元/集成测试的最佳实践

sql-server - 无法更改用户密码