Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Group by day of week

Tags:

sql

postgresql

I have a table conversations with an inserted_at column

I want to draw a chart showing the amount of conversations created over time.

I'd like to be able to group the data by either the date, the day of week, and the time of date, to show possible trends.

I'll be using intervals of 7 days, 1 month and 6 months.

Example:

Interval: 1 month group by day of week

I'd like something like

| Monday | Tuesday | Wednesday | Thursday | Friday |
|--------|---------|-----------|----------|--------|
| 11     | 22      | 19        | 17       | 10     |

or interval: 7 days group by date

| 1/1 | 2/1 | 3/1 | 4/1 | 5/1 | 6/1 | 7/1 |
|-----|-----|-----|-----|-----|-----|-----|
| 11  | 22  | 19  | 17  | 10  | 10  | 7   |

What is the best way to accomplish this (examples would be greatly appreciated), and is PostgreSQL fit for these kind of queries?

Lastly, are there any special sort of indexes that will improve such queries?

like image 781
Tarlen Avatar asked Aug 17 '16 15:08

Tarlen


People also ask

Can you group by week in SQL?

How Do You Group Data by Week in SQL Server? SQL Server provides a function called DATEPART() , which returns a specified part (year, quarter, month, week, hour, minute, etc.) of a specified date. ORDER BY DATEPART(week, RegistrationDate);

How do I count a specific day of the week in SQL?

The WEEKDAY() function returns the weekday number for a given date. Note: 0 = Monday, 1 = Tuesday, 2 = Wednesday, 3 = Thursday, 4 = Friday, 5 = Saturday, 6 = Sunday.


1 Answers

Days of the week:

select
    count(extract(dow from inserted_at) = 1 or null) as monday,
    count(extract(dow from inserted_at) = 2 or null) as tuesday,
    count(extract(dow from inserted_at) = 3 or null) as wednesday,
    count(extract(dow from inserted_at) = 4 or null) as thursday,
    count(extract(dow from inserted_at) = 5 or null) as friday,
from conversations

count only counts not null values. false or null is null so only true will be counted.

In newer versions there is an aggregation filter:

count(*) filter (where extract(dow from inserted_at) = 4) as thursday
like image 97
Clodoaldo Neto Avatar answered Sep 28 '22 03:09

Clodoaldo Neto