【问题标题】:SQL query to get maximum of all maximum values per customerSQL查询以获取每个客户的所有最大值中的最大值
【发布时间】:2013-10-22 09:17:34
【问题描述】:

我在很长一段时间内都在为这个特定的 Access 2010 SQL 查询苦苦挣扎。让我先给你看看我的桌子是什么样子的:

customerID     value
123456789        100
123456789       -100
123456789        300
123456789       -300
123456789        150
123456789       -150
123456789        200
123456789        200
987654321        500
987654321       -500
987654321        200
987654321       -200
987654321        210
987654321        210

您会看到,一个 customerID 有多个条目,其中包含多个值。这些值可以是正的也可以是负的。负值表示更正,因此相应的正值“被归零”。

我现在需要查询的是每个 customerID 的所有最大值中的最大值。在上面的示例中,customerID 123456789 的最大值为 200,因为此 customerID 上的所有其他值相互抵消。 customerID 987654321 的最大值因此为 210。

最终,我的查询应该返回 210 作为每个 customerID 的所有最大值中的最大值,这些最大值没有被负值纠正/取消。

你能帮我解决这个问题吗?

编辑:向两个 customerID 添加(重复)值 200 和 210,以明确 SUM() 在这里不起作用。

编辑 #2:这是一些(几乎)真实生活数据:http://pastebin.com/TbNRTw5A

【问题讨论】:

    标签: sql group-by ms-access-2010 max greatest-n-per-group


    【解决方案1】:

    我不知道这是否是你的答案,它只是假设所有负值都有 1 个对应的相等正值配对。

    SELECT CustomerID, SUM(Stack1.Value) FROM Stack1 
    GROUP BY CustomerID
    

    所以结果是:

    CustomerID  Value
    123456789   200
    987654321   210
    

    希望对你有帮助


    这个怎么样?

    WITH tmpPositive AS (SELECT 
        Stack1.CustomerID, Stack1.Value FROM Stack1 WHERE Stack1.Value > 0),
       tmpNegative AS (SELECT 
        Stack1.CustomerID, Stack1.Value FROM Stack1 WHERE Stack1.Value < 0)
    SELECT tmpPositive.CustomerID, MAX(tmpPositive.Value) AS MaxValue FROM tmpPositive
    LEFT OUTER JOIN tmpNegative 
    ON tmpPositive.CustomerID = tmpNegative.CustomerID AND
       -tmpPositive.Value = tmpNegative.Value
    WHERE tmpNegative.CustomerID IS NULL
    GROUP BY tmpPositive.CustomerID;
    

    这是测试数据:

    CustomerID Value
    ---------------------
    123456789 100
    123456789 -100
    123456789 300
    123456789 -300
    123456789 150
    123456789 -150
    123456789 200
    987654321 500
    987654321 -500
    987654321 200
    987654321 -200
    987654321 210
    123456789 200
    123456789 110
    987654321 1250
    

    以及我对上述查询的结果。

    CustomerID  MaxValue
    --------------------
    123456789   200
    987654321   1250
    

    【讨论】:

    • 这就是问题所在。可能有只有正值而没有相应负值的客户 ID,我猜这会使加入变得困难。这些正值也可能完全相同,因此存在多个完全冗余的条目。只是为了记录,我没有建立那个数据库。 ;-)
    • @Popopinsel 你不需要加入。执行 SUM() 时,正/负对相互抵消,因为它们属于同一个 CustomerID,这就是该查询如何进行 GROUP BY。然后,如果您想找到该(每个客户 ID)查询返回的最大值,只需将其包装在另一个 SELECT MAX(Value) ... 查询中即可。
    • 但是,同样,如果没有正负值对,而只有正值(相同或不同),则 SUM() 不会返回最大值。显然它会返回所有正值的总和。
    • 更新的答案看起来很有趣(如果可能的话,我会再次投票给答案)。不过,Access SQL 不支持 CTE 实在是太糟糕了......
    • @Popopinsel 好的,那么,没有自动编号字段或时间戳字段或其他方式来进行不相等的连接我相当肯定没有(实用的)方法可以使用 Access 来做你想做的事SQL。但是,一些 VBA 代码可能会这样做......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-29
    • 2018-10-21
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    • 2021-06-10
    相关资源
    最近更新 更多