Database
 sql >> база данни >  >> RDS >> Database

Научете основния анализ на данни с функциите на SQL прозорец

Тази статия е за функциите на прозореца на T-SQL (Transact-SQL) и тяхната основна употреба в ежедневните задачи за анализ на данни.

Има много алтернативи на T-SQL, когато става въпрос за анализ на данни. Въпреки това, когато се обмислят подобрения с течение на времето и въвеждането на функциите на прозореца, T-SQL е в състояние да извършва анализ на данни на основно ниво, а в някои случаи дори и извън това.

Относно функциите на SQL прозорец

Първо, нека първо се запознаем с функциите на SQL Window в контекста на документацията на Microsoft.

Определение на Microsoft

Прозоречна функция изчислява стойност за всеки ред в прозореца.

Проста дефиниция

Функцията прозорец ни помага да се съсредоточим върху определена част (прозорец) от набора от резултати, така че да можем да извършим анализ на данни само върху тази конкретна част (прозорец), а не върху целия набор от резултати.

С други думи, функциите на прозореца на SQL превръщат резултатен набор в няколко по-малки набора за целите на анализа на данни.

Какво е набор от резултати

Просто казано, наборът от резултати се състои от всички записи, извлечени чрез изпълнение на SQL заявка.

Например, можем да създадем таблица с име Продукт и вмъкнете следните данни в него:

-- (1) Create the Product table
CREATE TABLE [dbo].[Product]
(
	[ProductId] INT NOT NULL PRIMARY KEY,
	[Name] VARCHAR(40) NOT NULL,
	[Region] VARCHAR(40) NOT NULL
)

-- (2) Populate the Product table
INSERT INTO Product
(ProductId,Name,Region)
VALUES
(1,'Laptop','UK'),(2,'PC','UAE'),(3,'iPad','UK')

Сега наборът от резултати, извлечен с помощта на скрипта по-долу, ще съдържа всички редове от Продукта таблица:

-- (3) Result set
SELECT [ProductId], [Name],[Region] FROM Product

Какво е прозорец

Важно е първо да разберете концепцията за прозорец, тъй като тя се отнася до функциите на прозореца на SQL. В този контекст прозорецът е просто начин за стесняване на обхвата ви чрез насочване към конкретна част от набора от резултати (както вече споменахме по-горе).

Може би се чудите сега – какво всъщност означава „насочване към конкретна част от набора от резултати“?

Връщайки се към примера, който разгледахме, можем да създадем SQL прозорец въз основа на продуктовия регион, като разделим набора от резултати на два прозореца.

Разбиране на номер_ред()

За да продължим, ще трябва да използваме функцията Row_Number() което временно дава пореден номер на изходните редове.

Например, ако искаме да добавим номера на редове към набора от резултати въз основа на ProductID, ще трябва да използваме ROW_NUMBER() да го поръчате по продуктов ID, както следва:

--Using the row_number() function to order the result set by ProductID
SELECT ProductID,ROW_NUMBER() OVER (ORDER BY ProductID) AS SrNo,Name,Region FROM Product

Сега, ако искаме функцията Row_Number() за да поръчате набора от резултати от ProductID низходящ, след това последователността от изходни редове въз основа на ProductID ще се промени, както следва:

--Using the row_number() function to order the result set by ProductID descending
SELECT ProductID,ROW_NUMBER() OVER (ORDER BY ProductID DESC) AS SrNo,Name,Region FROM Product

Все още няма SQL прозорци, тъй като единственото нещо, което направихме, е да подредим набора по конкретни критерии. Както беше обсъдено по-рано, прозорецът означава разделяне на набора от резултати на няколко по-малки набора, за да се анализира всеки един от тях поотделно.

Създаване на прозорец с Row_Number()

За да създадем SQL прозорец в нашия набор от резултати, ще трябва да го разделим въз основа на която и да е от колоните, които съдържа.

Вече можем да разделим набора от резултати по регион, както следва:

--Creating a SQL window based on Region
SELECT ROW_NUMBER() OVER (Partition by region ORDER BY Region) as Region_Serial_Number
, Name, Region FROM dbo.Product

Изберете – Над Клауза

С други думи, Изберете с Над клаузата проправя пътя за функциите на SQL прозорци, като разделя набор от резултати на по-малки прозорци.

Съгласно документацията на Microsoft, Изберете с Над клаузата дефинира прозорец, който след това може да се използва от всяка функция на прозореца.

Сега нека създадем таблица, наречена KitchenProduct както следва:

CREATE TABLE [dbo].[KitchenProduct]
(
	[KitchenProductId] INT NOT NULL PRIMARY KEY IDENTITY(1,1),
	[Name] VARCHAR(40) NOT NULL,
	[Country] VARCHAR(40) NOT NULL,
	[Quantity] INT NOT NULL,
	[Price] DECIMAL(10,2) NOT NULL
);
GO

INSERT INTO dbo.KitchenProduct
(Name, Country, Quantity, Price)
VALUES
('Kettle','Germany',10,15.00)
,('Kettle','UK',20,12.00)
,('Toaster', 'France',10,10.00)
,('Toaster','UAE',10,12.00)
,('Kitchen Clock','UK',50,20.00)
,('Kitchen Clock','UAE',35,15.00)

Сега нека разгледаме таблицата:

SELECT [KitchenProductId], [Name], [Country], [Quantity], [Price] FROM dbo.KitchenProduct

Ако искате да видите всеки продукт със собствен сериен номер, а не с номер, базиран на обобщения идентификационен номер на продукта, тогава ще трябва да използвате функция на прозорец на SQL, за да разделите резултатния набор по продукт, както следва:

-- Viewing each product in its own series
SELECT ROW_NUMBER() OVER (Partition by Name order by Name) Product_SrNo,Name,Country,Quantity
FROM dbo.KitchenProduct

Съвместимост (Select – Over Clause)

Според документацията на Microsoft , Select – Over Клаузата е съвместима със следните версии на SQL база данни:

  1. SQL Server 2008 и нагоре
  2. Azure SQL база данни
  3. Azure SQL Data Warehouse
  4. Паралелно хранилище за данни

Синтаксис

ИЗБЕРЕТЕ – НАД (Разделяне по Подреждане по )

Моля, обърнете внимание, че опростих синтаксиса, за да направя i т лесен за разбиране; моля, вижте на Документация на Microsoft, за да видите пълен синтаксис.

Предварителни условия

Тази статия е основно написана за начинаещи, но все още има някои предпоставки, които трябва да имате предвид.

Познаване на T-SQL

Тази статия предполага, че читателите имат основни познания за T-SQL и са способни да пишат и изпълняват основни SQL скриптове.

Настройте примерната таблица за продажби

Тази статия изисква следната примерна таблица, за да можем да изпълняваме нашите примери за функции на SQL прозорец:

-- (1) Create the Sales sample table
CREATE TABLE [dbo].[Sales]
(
	[SalesId] INT NOT NULL IDENTITY(1,1), 
    [Product] VARCHAR(40) NOT NULL,
	[Date] DATETIME2,
	[Revenue] DECIMAL(10,2), 
    CONSTRAINT [PK_Sales] PRIMARY KEY ([SalesId])
);
GO

-- (2) Populating the Sales sample table
SET IDENTITY_INSERT [dbo].[Sales] ON
INSERT INTO [dbo].[Sales] ([SalesId], [Product], [Date], [Revenue]) VALUES (1, N'Laptop', N'2017-01-01 00:00:00', CAST(200.00 AS Decimal(10, 2)))
INSERT INTO [dbo].[Sales] ([SalesId], [Product], [Date], [Revenue]) VALUES (2, N'PC', N'2017-01-01 00:00:00', CAST(100.00 AS Decimal(10, 2)))
INSERT INTO [dbo].[Sales] ([SalesId], [Product], [Date], [Revenue]) VALUES (3, N'Mobile Phone', N'2018-01-01 00:00:00', CAST(300.00 AS Decimal(10, 2)))
INSERT INTO [dbo].[Sales] ([SalesId], [Product], [Date], [Revenue]) VALUES (4, N'Accessories', N'2018-01-01 00:00:00', CAST(150.00 AS Decimal(10, 2)))
INSERT INTO [dbo].[Sales] ([SalesId], [Product], [Date], [Revenue]) VALUES (5, N'iPad', N'2019-01-01 00:00:00', CAST(300.00 AS Decimal(10, 2)))
INSERT INTO [dbo].[Sales] ([SalesId], [Product], [Date], [Revenue]) VALUES (6, N'PC', N'2019-01-01 00:00:00', CAST(200.00 AS Decimal(10, 2)))
INSERT INTO [dbo].[Sales] ([SalesId], [Product], [Date], [Revenue]) VALUES (7, N'Laptop', N'2019-01-01 00:00:00', CAST(300.00 AS Decimal(10, 2)))
SET IDENTITY_INSERT [dbo].[Sales] OFF

Вижте всички продажби, като изпълните следния скрипт:

-- View sales
SELECT
  [SalesId],[Product],[Date],[Revenue]
FROM dbo.Sales

Групиране по спрямо SQL функции на прозорец

Човек може да се чуди – каква е разликата между използването на клаузата Group By и функциите на прозореца на SQL?

Е, отговорът се крие в примерите по-долу.

Групиране по пример

За да видим общите продажби по продукти, можем да използваме Group By, както следва:

-- Total sales by product using Group By
SELECT
  Product
 ,SUM(REVENUE) AS Total_Sales
FROM dbo.Sales
GROUP BY Product
ORDER BY Product

И така, клаузата Group By ни помага да видим общите продажби. Общата стойност на продажбите е сумата от приходите за всички подобни продукти в същия ред без използвана клауза Group By. Ами ако се интересуваме да видим приходите (продажбата) на всеки отделен продукт заедно с общите продажби?

Тук влизат в действие функциите на SQL прозореца.

Пример за функция на SQL прозорец

За да видим продукта, приходите и общите приходи от всички подобни продукти, трябва да разделим данните на база страничен продукт, като използваме OVER() както следва:

-- Total sales by product using an SQL window function
SELECT
  Product
 ,REVENUE
 ,SUM(REVENUE) OVER (PARTITION BY PRODUCT) AS Total_Sales
FROM dbo.Sales

Резултатът трябва да бъде както следва:

Така че вече можем лесно да видим продажбите за всеки отделен продукт, заедно с общите продажби за този продукт. Например приходите за PC е 100,00, но общите продажби (сума от приходите за PC продукт) е 300,00, защото се продават два различни модела компютър.

Основен анализ с агрегатните функции

Агрегатните функции връщат една стойност след извършване на изчисления върху набор от данни.

В този раздел ще разгледаме допълнително функциите на прозореца на SQL – по-конкретно, като ги използваме заедно с агрегатните функции за извършване на основен анализ на данни.

Общи агрегатни функции

Най-често срещаните агрегатни функции са:

  1. Сбор
  2. Преброяване
  3. Мин.
  4. Макс.
  5. Ср. (средно)

Анализ на обобщени данни по продукт

За да анализираме набора от резултати на базата на страничен продукт с помощта на агрегатни функции, просто трябва да използваме агрегатна функция с дял от страничен продукт вътре в оператора OVER():

-- Data analysis by product using aggregate functions
SELECT Product,Revenue
,SUM(REVENUE) OVER (PARTITION BY PRODUCT) as Total_Sales 
,MIN(REVENUE) OVER (PARTITION BY PRODUCT) as Minimum_Sales 
,MAX(REVENUE) OVER (PARTITION BY PRODUCT) as Maximum_Sales 
,AVG(REVENUE) OVER (PARTITION BY PRODUCT) as Average_Sales 
FROM dbo.Sales

Ако погледнете по-отблизо PC или лаптоп продукти, ще видите как агрегатните функции работят заедно заедно с функцията на прозореца на SQL.

В примера по-горе можем да видим, че стойността на приходите за PC е 100,00 първия път и 200,00 следващия път, но общите продажби възлизат на 300,00. Подобна информация може да се види за останалите агрегатни функции.

Анализ на обобщени данни по дата

Сега нека извършим някои анализи на данни за продуктите на базата на дата, използвайки функции на SQL прозорец в комбинация с обобщени функции.

Този път ще разделим набора от резултати по дата, а не по продукт, както следва:

-- Data analysis by date using aggregate functions
SELECT Product,date,Revenue
,SUM(REVENUE) OVER (PARTITION BY DATE) as Total_Sales 
,MIN(REVENUE) OVER (PARTITION BY DATE) as Minimum_Sales 
,MAX(REVENUE) OVER (PARTITION BY DATE) as Maximum_Sales 
,AVG(REVENUE) OVER (PARTITION BY DATE) as Average_Sales 
FROM dbo.Sales

С това научихме основни техники за анализ на данни, използвайки подхода на SQL функциите на прозореца.

Неща за правене

След като вече сте запознати с функциите на прозореца на SQL, моля, опитайте следното:

  1. Имайки предвид примерите, които разгледахме, извършете основен анализ на данни, като използвате функциите на прозореца на SQL в примерната база данни, спомената в тази статия.
  2. Добавяне на колона „Клиент“ към примерната таблица „Продажби“ и вижте колко богат може да стане анализът ви на данни, когато към нея се добави друга колона (клиент).
  3. Добавяне на колона за регион към примерната таблица за продажби и извършване на основен анализ на данни с помощта на обобщени функции по регион.

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Мигриране на бази данни към Azure SQL база данни

  2. Най-близкото съвпадение, част 1

  3. Потенциални подобрения на ASPState

  4. Визуализиране на данни

  5. Проектиране на база данни 101