2016-05-01 15 views
5

Aktualnie używam następującego zapytania SQL, które zwraca 25 wierszy. W jaki sposób można zmodyfikować go zignorować pierwszy wiersz:Zaznacz wszystkie wiersze i zignoruj ​​pierwszy wiersz.

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 

Używam 2008.

Dzięki SQL Server.

+0

Nie wierzę LIMIT i OFFSET są dostępne w SQL Server 2008. Prawdopodobnie będzie trzeba użyć jakiś wariant ROW_NUMBER() (z wyjątkiem gdzie jest równa 1) . – ZLK

+2

... _Dlaczego chcesz zignorować pierwszy rząd? Dlaczego po prostu nie wykluczać tego roku podatkowego z klauzulą ​​"WHERE"? Zauważ, że wykluczenie go po uruchomieniu 'AVG' (jak w przypadku' OFFSET' lub użycia funkcji okna) spowodowałoby, że średnia 'niepoprawna' - dodawałaby liczby, które nie są widoczne dla użytkownika. –

Odpowiedz

3

Można użyć EXCEPT w SQL Server 2008.

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 

Dla SQL Server 2012 i powyżej, można użyć FETCH OFFSET

0

zakładając, to jest dokładnie, jak chcesz go zapytać, a następnie: 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

A następnie można usunąć "zamówienie przez".
działa na wszystkich wersjach

+0

... jest to prawdopodobnie lepsza opcja, ale zmieni swój wynik w porównaniu z innymi odpowiedziami, ponieważ zmieni się średnia bieżąca. Ponadto, nie, ty (prawdopodobnie) nie możesz usunąć "ORDER BY" - jeśli OP chce ich w określonej kolejności (niezależnie od usunięcia "pierwszego"), potrzebuje klauzuli. –

0

ROW_NUMBER można użyć funkcji okna

;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

nadzieję, że to jest poprawna. To, co starałem się zrobić to:

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