2016-05-01 17 views
5

Attualmente sto utilizzando la seguente query SQL che restituisce 25 righe. Come posso modificarlo in modo da ignorare la prima fila:Seleziona tutte le righe e ignora la prima riga

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 

sto usando 2008.

Grazie SQL Server.

+0

Non credo LIMIT e offset sono disponibili in SQL Server 2008. Si avrà probabilmente bisogno di usare una qualche variante del ROW_NUMBER() (escluso dove è uguale a 1) . – ZLK

+2

... _Perché vuoi ignorare la prima riga? Perché non escludere solo quell'anno fiscale con una clausola 'WHERE'? Nota che escludendolo dopo l'esecuzione di 'AVG' (come con' OFFSET' o usando una funzione finestra) renderebbe la media 'errata' - aggiungerei numeri che non sono visibili all'utente. –

risposta

3

È possibile utilizzare EXCEPT in 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 

Per SQL Server 2012 e, soprattutto, è possibile utilizzare FETCH OFFSET

0

assumendo questo è esattamente come ci si esegue una query, quindi: 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

E quindi è possibile rimuovere "ordine per".
Funziona su tutte le versioni

+0

... questa è probabilmente l'opzione migliore, ma cambierà il suo output rispetto alle altre risposte, perché la media corrente cambierà. Inoltre, no, tu (probabilmente) non puoi rimuovere 'ORDER BY' - se l'OP li vuole in un ordine specifico (indipendentemente dalla rimozione del 'primo'), ha bisogno della clausola. –

0

è possibile utilizzare ROW_NUMBER funzione finestra

;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

Spero che questo è corretto. Questo è quello che ho cercato di renderla:

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 
Problemi correlati