برنامه نویسی

گروه بندی بر اساس سال، ماه یا روز در 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

و مدیر شما از شما سه شرط می خواهد:

  1. مجموع فروش سفارشات را محاسبه کنید هر سال.

  2. مجموع فروش سفارشات را محاسبه کنید هر ماه در سال 2023.

  3. مجموع فروش سفارشات را محاسبه کنید هر روز در جولای 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()

قبل از اینکه ترک کنی

اگر این مقاله برای شما مفید بود، این مقالات را نیز بررسی کنید:

خیلی ممنون که تا این لحظه همراه من بودید. امیدوارم از خواندن این مقاله لذت ببرید.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا