گروه بندی بر اساس سال، ماه یا روز در PostgreSQL
معرفی
PostgreSQL یکی از بهترین پایگاه داده های رابطه ای است که توسعه دهندگان به طور روزانه از آن استفاده می کنند.
در واقع، PostgreSQL از طیف گسترده ای از دستکاری و تجزیه و تحلیل داده ها پشتیبانی می کند. یکی از مهمترین ویژگی های تجزیه و تحلیل، گروه بندی داده ها بر اساس یک بازه زمانی خاص است.
بیایید نشان دهیم که PostgreSQL چگونه این ویژگی را به زیبایی مدیریت می کند.
نیازهای مدیر شما
قبل از کاوش عمیق تر، بیایید در نظر بگیریم که شما موارد زیر را دارید orders
جدول:
شناسه | قیمت | ایجاد شده در |
---|---|---|
1 | 100 | 2022-01-12 01:15:00 |
2 | 120 | 2022-02-10 23:44:00 |
3 | 80 | 2023-01-09 08:14:00 |
4 | 150 | 2023-07-09 20:50:00 |
5 | 50 | 2023-07-10 09:33:00 |
6 | 30 | 2023-07-10 15:23:00 |
7 | 90 | 2023-09-23 10:12:00 |
و مدیر شما از شما سه شرط می خواهد:
-
مجموع فروش سفارشات را محاسبه کنید هر سال.
-
مجموع فروش سفارشات را محاسبه کنید هر ماه در سال 2023.
-
مجموع فروش سفارشات را محاسبه کنید هر روز در جولای 2023.
گروه بر حسب سال
بیایید اولین نیاز را حل کنیم.
1- استفاده از DATA_TRUNC()
این تابع، همانطور که از نامش پیداست، یک تاریخ را بر اساس یک قسمت تاریخ خاص کوتاه می کند. در اینجا می توانید در مورد آن بیشتر بدانید.
SELECT DATE_TRUNC('YEAR', "createdAt") AS year, SUM("price") AS total
FROM "orders"
GROUP BY year
ORDER BY year
این بیانیه برمی گرداند:
سال | جمع |
---|---|
2022-01-01 00:00:00 | 220 |
2023-01-01 00:00:00 | 400 |
ممکن است توجه داشته باشید که year
رشته به عنوان مهر زمانی گرد شده به سطح مشخصی از دقت بازگردانده می شود، نه به عنوان یک عدد.
برای برگرداندن سال به عنوان یک عدد، می توانید از موارد زیر استفاده کنید:
SELECT DATE_PART('YEAR', DATE_TRUNC('YEAR', "createdAt")::TIMESTAMP)::INTEGER AS year
...
::INTEGER
مقدار مضاعف برگردانده شده از را ارسال می کندDATE_PART()
به یک عدد صحیح
2- استفاده از EXTRACT()
این تابع یک سال، ماه یا … را از تاریخ استخراج می کند. در اینجا بیشتر در مورد آن بدانید.
SELECT EXTRACT(YEAR FROM "createdAt")::INTEGER AS year, SUM("price") AS total
FROM "orders"
GROUP BY year
ORDER BY year
این بیانیه برمی گرداند:
سال | جمع |
---|---|
2022 | 220 |
2023 | 400 |
بر خلاف DATE_TRUNC()
تابع، EXTRACT()
تابع سال را به صورت دوبرابر برمی گرداند. بنابراین استفاده کردم ::INTEGER
برای ریختن مقدار دو برابری بازگشتی از EXTRACT()
به یک عدد صحیح
3- استفاده از TO_CHAR()
این تابع ورودی خود را به رشته تبدیل می کند. اینجا را بررسی کن.
SELECT TO_CHAR("createdAt", 'YYYY')::INTEGER AS year, SUM("price") AS total
FROM "orders"
GROUP BY year
ORDER BY year
::INTEGER
مقدار رشته برگردانده شده از را ارسال می کندTO_CHAR()
به یک عدد صحیح
این عبارت همان نتیجه را برمی گرداند EXTRACT()
.
گروه بر اساس ماه در سال
بیایید شرط دوم را حل کنیم.
مانند گروه بندی بر اساس سال، می توانید با استفاده از همان توابع، ماهانه در سال گروه بندی کنید.
1- استفاده از DATA_TRUNC()
SELECT DATE_TRUNC('MONTH', "createdAt") AS month, SUM("price") AS total
FROM "orders"
WHERE DATE_PART('YEAR', "createdAt") = 2023
GROUP BY month
ORDER BY month
این بیانیه برمی گرداند:
ماه | جمع |
---|---|
2023-01-01 00:00:00 | 80 |
2023-07-01 00:00:00 | 230 |
2023-09-01 00:00:00 | 90 |
2- استفاده از EXTRACT()
SELECT EXTRACT(MONTH FROM "createdAt")::INTEGER AS month, SUM("price") AS total
FROM "orders"
WHERE DATE_PART('YEAR', "createdAt") = 2023
GROUP BY month
ORDER BY month
این بیانیه برمی گرداند:
ماه | جمع |
---|---|
1 | 80 |
7 | 230 |
9 | 90 |
3- استفاده از TO_CHAR()
SELECT TO_CHAR("createdAt", 'MM')::INTEGER AS month, SUM("price") AS total
FROM "orders"
WHERE DATE_PART('YEAR', "createdAt") = 2023
GROUP BY month
ORDER BY month
این عبارت همان نتیجه را برمی گرداند EXTRACT()
.
گروه به روز در یک ماه از سال
بیایید شرط سوم را حل کنیم.
1- استفاده از DATA_TRUNC()
SELECT DATE_TRUNC('DAY', "createdAt") AS day, SUM("price") AS total
FROM "orders"
WHERE DATE_PART('MONTH', "createdAt") = 7 AND DATE_PART('YEAR', "createdAt") = 2023
GROUP BY day
ORDER BY day
این بیانیه برمی گرداند:
روز | جمع |
---|---|
2023-07-09 00:00:00 | 150 |
2023-07-10 00:00:00 | 80 |
2- استفاده از EXTRACT()
SELECT EXTRACT(DAY FROM "createdAt")::INTEGER AS day, SUM("price") AS total
FROM "orders"
WHERE DATE_PART('MONTH', "createdAt") = 7 AND DATE_PART('YEAR', "createdAt") = 2023
GROUP BY day
ORDER BY day
این بیانیه برمی گرداند:
3- استفاده از TO_CHAR()
SELECT TO_CHAR("createdAt", 'DD')::INTEGER AS day, SUM("price") AS total
FROM "orders"
WHERE DATE_PART('MONTH', "createdAt") = 7 AND DATE_PART('YEAR', "createdAt") = 2023
GROUP BY day
ORDER BY day
این عبارت همان نتیجه را برمی گرداند EXTRACT()
.
نتیجه
در این مقاله میدانیم چگونه دادهها را بر اساس فاصله زمانی مشخص، سال، ماه و روز گروهبندی کنیم.
و برای انجام این کار، سه روش مختلف را با استفاده از آنها معرفی کردیم:
-
DATE_TRUNC()
-
استخراج کردن()
-
TO_CHAR()
قبل از اینکه ترک کنی
اگر این مقاله برای شما مفید بود، این مقالات را نیز بررسی کنید:
خیلی ممنون که تا این لحظه همراه من بودید. امیدوارم از خواندن این مقاله لذت ببرید.