选择所有行并忽略第一行。

6

我目前正在使用以下SQL查询,它返回25行。如何修改它以忽略第一行:

SELECT fiscal_year, SUM(total_sales) as sum_of_year, AVG(SUM(total_sales)) 
OVER () as avg_sum 
FROM sales_report 
GROUP BY fiscal_year 
ORDER BY fiscal_year ASC

我正在使用 SQL Server 2008。

谢谢。


我不相信SQL Server 2008中有LIMIT和OFFSET。你可能需要使用ROW_NUMBER()的某个变体(排除等于1的情况)。 - ZLK
2
你为什么要忽略第一行?为什么不使用 WHERE 子句来排除那个财政年度呢?请注意,在 AVG 运行后排除它(例如使用 OFFSET 或窗口函数)会使平均值“不正确”——你会添加用户看不到的数字。 - Clockwork-Muse
5个回答

3
您可以在 SQL Server 2008 中使用 EXCEPT
SELECT fiscal_year, SUM(total_sales) as sum_of_year, AVG(SUM(total_sales)) 
OVER () as avg_sum 
FROM sales_report 
GROUP BY fiscal_year

EXCEPT

SELECT TOP 1 fiscal_year, SUM(total_sales) as sum_of_year, AVG(SUM(total_sales)) 
OVER () as avg_sum 
FROM sales_report 
GROUP BY fiscal_year 
ORDER BY fiscal_year ASC

对于SQL Server 2012及以上版本,您可以使用FETCH OFFSET


1
假设这正是您查询的方式,那么: SELECT fiscal_year, SUM(total_sales) as sum_of_year, AVG(SUM(total_sales)) OVER () as avg_sum FROM sales_report WHERE fiscal year <> (SELECT MIN(Fiscal_year) FROM sales_report)) GROUP BY fiscal_year ORDER BY fiscal_year ASC 然后您可以删除“order by”。 适用于所有版本。

1
这可能是更好的选择,但与其他答案相比,它将改变输出,因为运行平均值会改变。另外,不,您(可能)无法删除 ORDER BY - 如果 OP 想要按特定顺序排列它们(无论是否删除“第一个”),则需要该子句。 - Clockwork-Muse

0

您可以使用ROW_NUMBER窗口函数

;with cte as
(
SELECT Row_number()over(order by fiscal_year) as RN,fiscal_year, SUM(total_sales) as sum_of_year, AVG(SUM(total_sales)) 
OVER () as avg_sum 
FROM sales_report 
GROUP BY fiscal_year 
)
select * 
From cte
Where RN <> 1
ORDER BY fiscal_year ASC

0
希望这是正确的。这就是我尝试制作它的内容:
SELECT fiscal_year
    ,a.sum_of_year
    ,AVG(SUM(a.sum_of_year)) OVER () AS avg_sum
FROM (
    SELECT Row_number() OVER (
            ORDER BY fiscal_year
            ) AS RN
        ,fiscal_year
        ,SUM(total_sales) AS sum_of_year
    FROM test_fiscal
    GROUP BY fiscal_year
    ) a
WHERE a.rN > 1
GROUP BY fiscal_year
    ,rn
    ,a.sum_of_year
ORDER BY fiscal_year ASC

0

使用以下查询来构建完美运行的查询

WITH cte_customers AS (
    SELECT 
        ROW_NUMBER() OVER(
             ORDER BY 
                first_name, 
                last_name
        ) row_num, 
        customer_id, 
        first_name, 
        last_name
     FROM 
        sales.customers
) SELECT 
    customer_id, 
    first_name, 
    last_name
FROM 
    cte_customers
WHERE 
    row_num <> 1;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接