មុខងារ Window គឺជាមុខងារដ៏មានអានុភាពនៅក្នុង SQL ដែលប្រើដើម្បីអនុវត្តការគណនានៅទូទាំងជួរជួរដែលទាក់ទងនឹងជួរដេកបច្ចុប្បន្ន។ មិនដូចមុខងារសរុបទេ មុខងារបង្អួចមិនដាក់ជួរជាក្រុមទៅក្នុងលទ្ធផលតែមួយទេ។ ពួកគេត្រឡប់លទ្ធផលសម្រាប់ជួរនីមួយៗ ខណៈពេលដែលរក្សាបរិបទនៃសំណុំទិន្នន័យ។
នៅក្នុងអត្ថបទនេះ យើងនឹងស្វែងយល់ពីមុខងារបង្អួច SQL ដែលប្រើជាទូទៅមួយចំនួន ( ROW_NUMBER()
, RANK()
, DENSE_RANK()
, NTILE()
, LEAD()
, និង LAG()
) ជាមួយឧទាហរណ៍។
យើងនឹងប្រើតារាងលក់ខាងក្រោមដើម្បីបង្ហាញមុខងារបង្អួច៖
លេខសម្គាល់ផ្នែកលក់ | លេខសម្គាល់អតិថិជន | ផលិតផល | តំបន់ | ចំនួនទឹកប្រាក់ | កាលបរិច្ឆេទលក់ |
---|---|---|---|---|---|
១ | ១០១ | កុំព្យូទ័រយួរដៃ | ខាងជើង | ១២០០ | 2023-01-05 |
២ | ១០២ | ថេប្លេត | ខាងជើង | ៨០០ | 2023-02-15 |
៣ | ១០៣ | ទូរស័ព្ទ | ខាងជើង | ៨០០ | 2023-03-10 |
៤ | ១០៤ | ថេប្លេត | ខាងជើង | ៥០០ | 2023-04-01 |
៥ | ១០៥ | កុំព្យូទ័រយួរដៃ | ខាងត្បូង | ១៣០០ | 2023-05-05 |
៦ | ១០៦ | ថេប្លេត | ខាងត្បូង | ៧០០ | 2023-06-20 |
៧ | ១០៧ | ទូរស័ព្ទ | ខាងលិច | ៩០០ | 2023-07-15 |
៨ | ១០៨ | កុំព្យូទ័រយួរដៃ | ខាងកើត | ១៣០០ | 2023-08-10 |
អនុគមន៍ ROW_NUMBER() ផ្តល់លេខពិសេសមួយទៅជួរនីមួយៗក្នុងភាគថាស តម្រៀបតាមជួរឈរដែលបានបញ្ជាក់។
កិច្ចការ ៖ កំណត់លេខជួរដេកតែមួយគត់ចំពោះការលក់នីមួយៗនៅក្នុងតំបន់មួយ ដោយផ្អែកលើចំនួនលក់ (ខ្ពស់បំផុតទៅទាបបំផុត)។
SELECT SalesID, Region, Amount, ROW_NUMBER() OVER (PARTITION BY Region ORDER BY Amount DESC) AS RowNum FROM Sales;
លទ្ធផល ៖
លេខសម្គាល់ផ្នែកលក់ | តំបន់ | ចំនួនទឹកប្រាក់ | ជួរដេក |
---|---|---|---|
១ | ខាងជើង | ១២០០ | ១ |
២ | ខាងជើង | ៨០០ | ២ |
៣ | ខាងជើង | ៨០០ | ៣ |
៤ | ខាងជើង | ៥០០ | ៤ |
៥ | ខាងត្បូង | ១៣០០ | ១ |
៦ | ខាងត្បូង | ៧០០ | ២ |
៧ | ខាងលិច | ៩០០ | ១ |
៨ | ខាងកើត | ១៣០០ | ១ |
អនុគមន៍ RANK() ផ្តល់ចំណាត់ថ្នាក់ទៅជួរនីមួយៗក្នុងភាគថាស។ ជួរដេកដែលមានតម្លៃដូចគ្នាទទួលបានចំណាត់ថ្នាក់ដូចគ្នា ហើយចំណាត់ថ្នាក់បន្ទាប់ត្រូវបានរំលង។
កិច្ចការ ៖ ចាត់ថ្នាក់ការលក់នៅក្នុងតំបន់នីមួយៗតាមចំនួន (ខ្ពស់បំផុតទៅទាបបំផុត)។
SELECT SalesID, Region, Amount, RANK() OVER (PARTITION BY Region ORDER BY Amount DESC) AS Rank FROM Sales;
លទ្ធផល ៖
លេខសម្គាល់ផ្នែកលក់ | តំបន់ | ចំនួនទឹកប្រាក់ | ចំណាត់ថ្នាក់ |
---|---|---|---|
១ | ខាងជើង | ១២០០ | ១ |
២ | ខាងជើង | ៨០០ | ២ |
៣ | ខាងជើង | ៨០០ | ២ |
៤ | ខាងជើង | ៥០០ | ៤ |
៥ | ខាងត្បូង | ១៣០០ | ១ |
៦ | ខាងត្បូង | ៧០០ | ២ |
៧ | ខាងលិច | ៩០០ | ១ |
៨ | ខាងកើត | ១៣០០ | ១ |
មុខងារសំខាន់ ៖
មុខងារ DENSE_RANK() ផ្តល់ចំណាត់ថ្នាក់ដូចជា RANK() ប៉ុន្តែវាមិនរំលងចំណាត់ថ្នាក់បន្ទាប់ពីទំនាក់ទំនងទេ។
កិច្ចការ ៖ ចាត់ថ្នាក់ក្រាស់ៗដល់ការលក់ក្នុងតំបន់នីមួយៗតាមចំនួន (ខ្ពស់បំផុតទៅទាបបំផុត)។
SELECT SalesID, Region, Amount, DENSE_RANK() OVER (PARTITION BY Region ORDER BY Amount DESC) AS DenseRank FROM Sales;
លទ្ធផល ៖
លេខសម្គាល់ផ្នែកលក់ | តំបន់ | ចំនួនទឹកប្រាក់ | DenseRank |
---|---|---|---|
១ | ខាងជើង | ១២០០ | ១ |
២ | ខាងជើង | ៨០០ | ២ |
៣ | ខាងជើង | ៨០០ | ២ |
៤ | ខាងជើង | ៥០០ | ៣ |
៥ | ខាងត្បូង | ១៣០០ | ១ |
៦ | ខាងត្បូង | ៧០០ | ២ |
៧ | ខាងលិច | ៩០០ | ១ |
៨ | ខាងកើត | ១៣០០ | ១ |
មុខងារសំខាន់ ៖
NTILE() បែងចែកជួរដេកទៅជាចំនួនជាក់លាក់នៃក្រុមប្រហាក់ប្រហែល។
កិច្ចការ ៖ ចែកការលក់ទាំងអស់ជា ៤ក្រុម ដោយផ្អែកលើចំនួនតាមលំដាប់ចុះ។
SELECT SalesID, Amount, NTILE(4) OVER (ORDER BY Amount DESC) AS Quartile FROM Sales;
លទ្ធផល ៖
លេខសម្គាល់ផ្នែកលក់ | ចំនួនទឹកប្រាក់ | ត្រីមាស |
---|---|---|
៥ | ១៣០០ | ១ |
៨ | ១៣០០ | ១ |
១ | ១២០០ | ២ |
៧ | ៩០០ | ២ |
២ | ៨០០ | ៣ |
៣ | ៨០០ | ៣ |
៤ | ៥០០ | ៤ |
៦ | ៧០០ | ៤ |
LEAD() ទាញយកតម្លៃពីជួរបន្ទាប់ក្នុងភាគថាសដូចគ្នា។
កិច្ចការ ៖ ប្រៀបធៀបចំនួនលក់នីមួយៗទៅនឹងចំនួនលក់បន្ទាប់ ដែលបញ្ជាដោយ SaleDate ។
SELECT SalesID, Amount, LEAD(Amount) OVER (ORDER BY SaleDate) AS NextAmount FROM Sales;
លទ្ធផល ៖
លេខសម្គាល់ផ្នែកលក់ | ចំនួនទឹកប្រាក់ | ចំនួនទឹកប្រាក់បន្ទាប់ |
---|---|---|
១ | ១២០០ | ៨០០ |
២ | ៨០០ | ៨០០ |
៣ | ៨០០ | ៥០០ |
៤ | ៥០០ | ១៣០០ |
៥ | ១៣០០ | ៧០០ |
៦ | ៧០០ | ៩០០ |
៧ | ៩០០ | ១៣០០ |
៨ | ១៣០០ | NULL |
LAG()
ទាញយកតម្លៃពីជួរមុនក្នុងភាគថាសដូចគ្នា។
កិច្ចការ ៖ ប្រៀបធៀបចំនួនលក់នីមួយៗទៅនឹងចំនួនលក់មុន ដែលបញ្ជាដោយ SaleDate ។
SELECT SalesID, Amount, LAG(Amount) OVER (ORDER BY SaleDate) AS PrevAmount FROM Sales;
លទ្ធផល ៖
លេខសម្គាល់ផ្នែកលក់ | ចំនួនទឹកប្រាក់ | បរិមាណមុន។ |
---|---|---|
១ | ១២០០ | NULL |
២ | ៨០០ | ១២០០ |
៣ | ៨០០ | ៨០០ |
៤ | ៥០០ | ៨០០ |
៥ | ១៣០០ | ៥០០ |
៦ | ៧០០ | ១៣០០ |
៧ | ៩០០ | ៧០០ |
៨ | ១៣០០ | ៩០០ |
មុខងារបង្អួច SQL ដូចជា ROW_NUMBER(), RANK(), DENSE_RANK(), NTILE(), LEAD(), និង LAG() ផ្តល់នូវវិធីដ៏មានអានុភាពក្នុងការវិភាគទិន្នន័យនៅក្នុងភាគថាស។
គន្លឹះសំខាន់ៗ៖
ROW_NUMBER()
កំណត់អត្តសញ្ញាណតែមួយគត់សម្រាប់ជួរនីមួយៗ។RANK()
និង DENSE_RANK()
ខុសគ្នានៅក្នុងរបៀបដែលពួកគេគ្រប់គ្រងទំនាក់ទំនង (រំលងធៀបនឹងការមិនរំលង)។NTILE()
មានប្រយោជន៍សម្រាប់ការបែងចែកជួរដេកទៅជាក្រុមស្ថិតិ។LEAD()
និង LAG()
អនុញ្ញាតឱ្យមានការប្រៀបធៀបជាមួយជួរដែលនៅជាប់គ្នា។
តាមរយៈការធ្វើជាម្ចាស់នៃមុខងារទាំងនេះ អ្នកអាចគ្រប់គ្រងការវិភាគដ៏ស្មុគស្មាញ និងកិច្ចការចំណាត់ថ្នាក់ប្រកបដោយប្រសិទ្ធភាព!
សូមអរគុណសម្រាប់ការចំណាយពេលដើម្បីស្វែងរកការយល់ដឹងដែលទាក់ទងនឹងទិន្នន័យជាមួយខ្ញុំ។ ខ្ញុំសូមកោតសរសើរចំពោះការចូលរួមរបស់អ្នក។ ប្រសិនបើអ្នកយល់ថាព័ត៌មាននេះមានប្រយោជន៍ ខ្ញុំសូមអញ្ជើញអ្នកឱ្យតាមដានខ្ញុំ ឬភ្ជាប់ជាមួយខ្ញុំនៅលើ LinkedIn ។ រីករាយក្នុងការរុករក!👋