USE AdventureWorks2008R2;
GO
SELECT SalesOrderID, ProductID, OrderQty
,SUM(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Total'
,AVG(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Avg'
,COUNT(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Count'
,MIN(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Min'
,MAX(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Max'
FROM Sales.SalesOrderDetail
WHERE SalesOrderID IN(43659,43664);
Am citit despre această clauză și eu nu't înțelege de ce am nevoie de ea.
Ce face funcția "Peste" face? Ce inseamna Partiționare De
a face?
De ce't am face o interogare cu scrierea Grupului De SalesOrderID`?
Ai poate utilizarea GRUPULUI DE SalesOrderID`. Diferența este, cu GRUPUL DE tine pot avea numai valorile agregate pentru coloanele care nu sunt incluse în GRUPUL DE.
În contrast, folosind vitrate funcții agregate în loc de GRUP, puteti prelua ambele agregate și non-valori agregate. Asta este, deși nu faci asta în exemplu de interogare, ai putea prelua atât individuale, cât OrderQty valorile și sumele lor, contează, medii etc. pe grupuri de aceeași
SalesOrderID lui.
Aici's un exemplu practic de ce vitrate agregate sunt mari. Să presupunem că aveți nevoie pentru a calcula cât la sută din total, fiecare valoare este. Fără fereastră agregate ai'd mai întâi trebuie să obțină o listă de valori agregate și apoi se alăture înapoi la original rowset, de exemplu, ca aceasta:
SELECT
orig.[Partition],
orig.Value,
orig.Value * 100.0 / agg.TotalValue AS ValuePercent
FROM OriginalRowset orig
INNER JOIN (
SELECT
[Partition],
SUM(Value) AS TotalValue
FROM OriginalRowset
GROUP BY [Partition]
) agg ON orig.[Partition] = agg.[Partition]
Acum uită-te cum puteți face același lucru cu o fereastră agregate:
SELECT
[Partition],
Value,
Value * 100.0 / SUM(Value) OVER (PARTITION BY [Partition]) AS ValuePercent
FROM OriginalRowset orig
Mult mai ușor și mai curat, e't-l?
La "PESTE" clauza este puternic, în care puteți fi agregate pe diferite intervale ("ferestre"), dacă utilizați un GRUP DE` sau nu
Exemplu: ia conta pe SalesOrderID
și numărul de toate
SELECT
SalesOrderID, ProductID, OrderQty
,COUNT(OrderQty) AS 'Count'
,COUNT(*) OVER () AS 'CountAll'
FROM Sales.SalesOrderDetail
WHERE
SalesOrderID IN(43659,43664)
GROUP BY
SalesOrderID, ProductID, OrderQty
Obține diferite CONTE e, nu GROUP BY
SELECT
SalesOrderID, ProductID, OrderQty
,COUNT(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'CountQtyPerOrder'
,COUNT(OrderQty) OVER(PARTITION BY ProductID) AS 'CountQtyPerProduct',
,COUNT(*) OVER () AS 'CountAllAgain'
FROM Sales.SalesOrderDetail
WHERE
SalesOrderID IN(43659,43664)
Dacă ai vrut doar să-GRUP DE SalesOrderID te-ar't fi în măsură să includă ProductID și OrderQty coloane din clauza SELECT.
PARTIȚIA DE clauza sa's te desparți de funcții agregate. Una evidentă și utile exemplu ar fi dacă ai vrut pentru a genera numerele de linie pentru linii de ordine pe o comanda:
SELECT
O.order_id,
O.order_date,
ROW_NUMBER() OVER(PARTITION BY O.order_id) AS line_item_no,
OL.product_id
FROM
Orders O
INNER JOIN Order_Lines OL ON OL.order_id = O.order_id
(Sintaxa mea ar putea fi oprit ușor)
Apoi, veți obține ceva de genul:
order_id order_date line_item_no product_id
-------- ---------- ------------ ----------
1 2011-05-02 1 5
1 2011-05-02 2 4
1 2011-05-02 3 7
2 2011-05-12 1 8
2 2011-05-12 2 1
Permiteți-mi să explic cu un exemplu și vă va fi capabil pentru a vedea cum funcționează.
Presupunând că aveți următorul tabel DIM_EQUIPMENT:
VIN MAKE MODEL YEAR COLOR
-----------------------------------------
1234ASDF Ford Taurus 2008 White
1234JKLM Chevy Truck 2005 Green
5678ASDF Ford Mustang 2008 Yellow
Rula SQL de mai jos
SELECT VIN,
MAKE,
MODEL,
YEAR,
COLOR ,
COUNT(*) OVER (PARTITION BY YEAR) AS COUNT2
FROM DIM_EQUIPMENT
Rezultatul ar fi ca mai jos
VIN MAKE MODEL YEAR COLOR COUNT2
----------------------------------------------
1234JKLM Chevy Truck 2005 Green 1
5678ASDF Ford Mustang 2008 Yellow 2
1234ASDF Ford Taurus 2008 White 2
Vezi ce s-a întâmplat.
Sunteți în stare să numere fără Grup De la an la AN și se Potrivesc cu RÂND.
Un alt MOD Interesant de a obține același rezultat dacă, ca mai jos, folosind CU Clauze, CU lucrări ca și în linia de VEDERE și poate simplifica interogare mai ales cele complexe, ceea ce nu este cazul aici, deoarece eu sunt doar încercarea de a arăta utilizare
WITH EQ AS
( SELECT YEAR AS YEAR2, COUNT(*) AS COUNT2 FROM DIM_EQUIPMENT GROUP BY YEAR
)
SELECT VIN,
MAKE,
MODEL,
YEAR,
COLOR,
COUNT2
FROM DIM_EQUIPMENT,
EQ
WHERE EQ.YEAR2=DIM_EQUIPMENT.YEAR;
PESTE clauza atunci când sunt combinate cu PARTITIA DE stat, care anterior funcția de apel trebuie să fie făcut în mod analitic de evaluare a revenit rânduri de interogare. Cred că de ea ca o linie GRUP DE declarație.
PESTE (PARTIȚIE DE SalesOrderID)
e care să ateste că pentru SUM, AVG, etc... funcția returnează o valoare de PESTE un subset de înregistrări returnate de o interogare, și PARTIȚIA care subset DE cheie externă SalesOrderID.
Așa că ne vom REZUMA fiecare OrderQty înregistrare pentru FIECARE UNIC SalesOrderID, și că numele coloanei va fi numit 'Total'.
Este un mijloc MULT mai eficient decât folosind mai multe inline vedere să afle aceleași informații. Puteți pune această interogare într-un inline view și se filtrează pe Total atunci.
SELECT ...,
FROM (your query) inlineview
WHERE Total < 200
De Asemenea, Numit `De Interogare Petiție Clauza.
Similare cu `Group By Clauza de
pauză de date în bucăți (sau partiții)
separat de partiție limitele
funcția efectuează în termen de partiții
re-initializat la trecerea despărțire limita
Sintaxa:
funcția de (...) OVER (PARTITION BY col1 col3,...)
Funcții
Funcții familiare, cum ar fi COUNT(),
SUM(),
MIN(),
MAX()`, etc
Noi Funcții, precum și (de exemplu, ROW_NUMĂR()
, RATION_TO_REOIRT()
, etc.)
Mai multe informații cu exemplu : http://msdn.microsoft.com/en-us/library/ms189461.aspx
prkey whatsthat cash
890 "abb " 32 32
43 "abbz " 2 34
4 "bttu " 1 35
45 "gasstuff " 2 37
545 "gasz " 5 42
80009 "hoo " 9 51
2321 "ibm " 1 52
998 "krk " 2 54
42 "kx-5010 " 2 56
32 "lto " 4 60
543 "mp " 5 65
465 "multipower " 2 67
455 "O.N. " 1 68
7887 "prem " 7 75
434 "puma " 3 78
23 "retractble " 3 81
242 "Trujillo's stuff " 4 85
Ca's un rezultat de interogare. Tabelul folosit ca sursa este aceeași cu excepția că nu are nici ultima coloană. Această coloană este o mișcare sumă de al treilea.
Interogare:
SELECT prkey,whatsthat,cash,SUM(cash) over (order by whatsthat)
FROM public.iuk order by whatsthat,prkey
;
(tabelul merge la fel de publice.iuk)
sql version: 2012
L's un pic peste dbase(1986) nivelul, nu't știu de ce 25 de ani a fost nevoie să-l termin.