简体   繁体   中英

SELECT, group, limit based on month

Currently I am using this: SELECT ident,COUNT(*) FROM sales GROUP BY ident order by COUNT(*) DESC LIMIT 3 .

I use that to group each ident from sales table, and count the number of rows for each ident, and limit this to 3 rows. Now I want to only select the rows that were added the current month.

This is how the table looks like, sales table:

| ID |   ident  |  prdnr  |       transfer      |
| 1  |   HD762  | 7362781 | 2020-08-10 16:25:26 |
| 2  |   JJ313  | 4563456 | 2020-08-08 16:25:26 |
| 3  |   HD762  | 4363453 | 2020-08-08 16:25:26 |
| 4  |   JJ313  | 2326256 | 2020-08-08 16:25:26 |
| 5  |   HD762  | 8356345 | 2020-08-07 16:25:26 |
| 6  |   JJ844  | 3473563 | 2020-08-07 16:25:26 |

I think this should be the correct query:

SELECT ident,COUNT(*) FROM sales WHERE MONTH(transfer) = MONTH(CURRENT_DATE()) AND YEAR(transfer) = YEAR(CURRENT_DATE()) GROUP BY ident order by COUNT(*) DESC LIMIT 3

Somehow this does not gives me the correct count. What am I doing wrong?

Based on your requirement, a simple way is getting the MySQL current time and subtract a month to get the values

The code:-

SELECT ident,COUNT( ) FROM sales WHERE transfer > date_sub(now(), interval 1 month) GROUP BY ident order by COUNT( ) DESC LIMIT 3;

The output from the query

HD762   3
JJ313   2
JJ844   1

Please let me know if this is the expected result you're looking for.

Reference:- https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM