【问题标题】:SQL show the first and last value in countSQL 显示计数中的第一个和最后一个值
【发布时间】:2019-09-19 13:54:12
【问题描述】:

我需要编写一个查询来显示客户订单的最大和最小订单数。

我试过了:

(SELECT TOP 1 CustomerID, COUNT(*) AS Number_Of_Orders
FROM Orders
GROUP BY CustomerID
ORDER BY COUNT(*) ASC)

UNION ALL

(SELECT TOP 1 CustomerID, COUNT(*) AS Number_Of_Orders
FROM Orders
GROUP BY CustomerID
ORDER BY COUNT(*) DESC)

但我没有成功合并输出,我收到错误Incorrect syntax near the keyword 'ORDER'

我怎样才能得到它?

【问题讨论】:

    标签: sql sql-server tsql aggregate-functions northwind


    【解决方案1】:

    我不确定是否要运行两次聚合,所以使用窗口函数:

    SELECT CustomerID, Number_Of_Orders
    FROM (SELECT CustomerID, COUNT(*) AS Number_Of_Orders,
                 ROW_NUMBER() OVER (ORDER BY COUNT(*) ASC) as seqnum_asc,
                 ROW_NUMBER() OVER (ORDER BY COUNT(*) DESC) as seqnum_desc
          FROM Orders
          GROUP BY CustomerID
         ) c
    WHERE seqnum_asc = 1 OR seqnum_desc = 1;
    

    【讨论】:

      【解决方案2】:

      您不能在要与UNION 统一的查询中使用ORDER BY,但可以这样做:

      SELECT * FROM
        (SELECT TOP 1 CustomerID, COUNT(*) AS Number_Of_Orders
        FROM Orders
        GROUP BY CustomerID
        ORDER BY COUNT(*) ASC) t
      UNION ALL
      SELECT * FROM
        (SELECT TOP 1 CustomerID, COUNT(*) AS Number_Of_Orders
        FROM Orders
        GROUP BY CustomerID
        ORDER BY COUNT(*) DESC) t
      

      虽然效率低下,但这样做可以解决问题,因为您执行两次相同的代码并排序两次

      【讨论】:

        【解决方案3】:

        您可以为此使用窗口函数。如果有平局,这将为您提供多个客户的最小/最大数量 (fiddle):

        SELECT CustomerID
             , OrderCount
             , CASE WHEN OrderCount = MinOrderCount THEN 'Customer with min orders'
                    WHEN OrderCount = MaxOrderCount THEN 'Customer with max orders' END AS Type
        FROM (
            SELECT CustomerID
                 , COUNT(*) AS OrderCount
                 , MIN(COUNT(*)) OVER () AS MinOrderCount
                 , MAX(COUNT(*)) OVER () AS MaxOrderCount
            FROM Orders
            GROUP BY CustomerID
        ) AS x
        WHERE OrderCount = MinOrderCount OR OrderCount = MaxOrderCount
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多