I want to select match count from result where the match count is exact int on a date.
date id_event id_timewindows max_hits
2014-12-16 1 1,2,3 2
2014-12-16 2 2,3,4 2
2014-12-16 3 4 2
2014-12-16 4 5,6 2
2014-12-16 5 7,8 2
2014-12-16 6 9 2
The result what i want is:
date id_event id_timewindows max_hits
2014-12-16 1 2,3 2
2014-12-16 2 2,3 2
Have anybody idea, how to do it in MySQL?
UPDATE:
So i have to explain more. The id_timewindows is not a string attribute, the first one is a result of a view which grouped by id_events and one id_event has multiple id_timewindow.
View result before grouped:
date id_event id_timewindow begin end max_rooms
2014-12-16 1 1 06:00:00 07:00:00 2
2014-12-16 1 2 07:00:00 08:00:00 2
2014-12-16 1 3 08:00:00 09:00:00 2
2014-12-16 2 2 07:00:00 08:00:00 2
2014-12-16 2 3 08:00:00 09:00:00 2
2014-12-16 2 4 09:00:00 10:00:00 2
2014-12-16 3 4 09:00:00 10:00:00 2
2014-12-16 4 6 11:00:00 12:00:00 2
2014-12-16 4 5 10:00:00 11:00:00 2
2014-12-16 5 7 12:00:00 13:00:00 2
2014-12-16 5 8 13:00:00 14:00:00 2
2014-12-16 6 9 14:00:00 15:00:00 2
I use GROUP BY id_event and the id_timewindows is group_concat(id_timewindow SEPARATOR ',')
I found a solution:
SELECT
date,
id_timewindow,
max_rooms,
COUNT(concat(date, id_timewindow)) as counter
FROM `timewindows_reserved`
GROUP BY
date, id_timewindow
HAVING counter < max_rooms
That will result what inverse what i want and i can use it.
date id_timewindow max_hits
2014-12-16 1 2
2014-12-16 4 2
2014-12-16 5 2
2014-12-16 6 2
2014-12-16 7 2
2014-12-16 8 2
2014-12-16 9 2
If I group by date and make a LIST from the id_timewindow then i can recevie the same result as what I wanted, but in inverse logic. Not a reserved timewindows rather the free timewindows. If I reverse this then I can get the result:
SELECT
date,
id_event,
GROUP_CONCAT(id_timewindow SEPARATOR ','),
max_rooms,
COUNT(concat(date, id_timewindow)) as counter
FROM `table`
GROUP BY
date, id_timewindow
HAVING counter >= max_rooms
Related
I have a table like this
id
product_id
reserved_from
reserved_till
1
1
2021-10-30 11:00:00
2021-10-30 13:00:00
2
2
2021-10-28 10:00:00
2021-10-28 12:00:00
3
2
2021-10-28 11:00:00
2021-10-28 13:00:00
4
3
2021-10-28 11:00:00
2021-10-28 13:00:00
5
2
2021-10-28 08:00:00
2021-10-28 09:00:00
6
2
2021-10-28 12:00:00
2021-10-28 16:00:00
7
2
2021-10-30 11:00:00
2021-10-30 13:00:00
8
2
2021-10-28 08:30:00
2021-10-28 09:30:00
What I want is that I get 3 as maximum counted collisions / overlaps for product_id 2 on date 2021-10-28 (id: 2,3,6 are overlapping and the max).
After researching on Google, I found severall SQL statements, but those are based on start time and end time instead of day instead on finding the maximum collisions on that day.
You can use a self-join:
select count(*) overlap from bookings b join bookings b1
on b1.product_id = b.product_id and b.id != b1.id and date(b.reserved_from) = date(b.reserved_till) and b1.reserved_till > b.reserved_from and b1.reserved_from < b.reserved_from
where b.product_id = 2 and date(b.reserved_from) = "2021-10-28"
Output:
overlap
-------
3
I want to group by the JobId, StartTime & EndTime only for continuous days. If a specific row doesn't form part of a range it should be discarded. The Id's should also pivot into a column per grouping.
Id
Date
StartTime
EndTime
JobId
1
2021-08-23
08:30:00
19:00:00
1
2
2021-08-24
08:30:00
19:00:00
1
3
2021-08-24
12:30:00
14:30:00
2
4
2021-08-24
15:30:00
19:00:00
1
5
2021-08-25
08:30:00
19:00:00
1
6
2021-08-25
12:30:00
14:30:00
2
7
2021-08-25
15:45:00
19:00:00
1
8
2021-08-26
08:30:00
09:30:00
1
9
2021-08-26
15:30:00
19:00:00
1
10
2021-08-26
10:30:00
11:00:00
1
11
2021-08-26
12:00:00
14:30:00
1
12
2021-08-27
08:30:00
09:30:00
1
13
2021-08-27
11:00:00
11:15:00
1
14
2021-08-27
11:30:00
14:30:00
1
15
2021-08-28
08:30:00
09:30:00
1
Using the above sample data you can see 3 groupings that can form such a continuous range.
Range 1 consists of Id's, 1,2 & 5 - 2021-08-23 to 2021-08-25, 08:30:00 to 19:00:00
Range 2 consists of Id's 3 & 6 - 2021-08-24 to 2021-08-25, 12:30:00 to 14:30:00
Range 3 consists of Id's 8, 12 & 15 - 2021-08-26 to 2021-08-28, 08:30:00 to 09:30:00
The end result should be:
JobId
StartDate
EndDate
StartTime
EndTime
Ids
1
2021-08-23
2021-08-25
08:30:00
19:00:00
1,2,5
2
2021-08-24
2021-08-25
12:30:00
14:30:00
3,6
1
2021-08-26
2021-08-28
08:30:00
09:30:00
8,12,15
MySQL 8.0.23
Assuming that JobId, `Date`, StartTime, EndTime is unique you may use:
SELECT JobId,
MIN(`Date`) StartDate,
MAX(`Date`) EndDate,
StartTime,
EndTime,
GROUP_CONCAT(Id) Ids
FROM test
GROUP BY JobId,
StartTime,
EndTime
HAVING COUNT(*) > 1
AND DATEDIFF(EndDate, StartDate) = COUNT(*) - 1
ORDER BY StartDate, StartTime
https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=fce8590f72ac1d50cd9e89add3ed01e7
I have table like this
id date score
1 2017-01-01 5
1 2017-01-02 6
2 2017-01-03 7
2 2017-01-04 5
5 2017-04-02 4
5 2017-04-03 2
6 2017-04-04 9
7 2017-04-05 10
1 2017-05-28 5
1 2017-05-29 3
2 2017-05-30 5
2 2017-05-31 3
I want to sum the score based on date range
condition 1
2017-01-01 - 2017-01-04
condition 2
2017-04-01 - 2017-04-30
condition 3
2017-05-01 - 2017-05-31
the goal im looking for is to generate table shown below
id sum_condition_1 sum_condition_2 sum_condition_3
1 11 null 8
2 12 null 8
5 null 6 null
6 null 9 null
7 null 10 null
Sorry for my bad english. I have a database
Id Personel_ID DateTime
1 1 21.02.2018 07:31:00
2 1 21.02.2018 08:20:00
3 1 21.02.2018 18:15:00
4 2 21.02.2018 07:15:00
5 2 21.02.2018 07:18:00
6 2 21.02.2018 16:25:00
7 2 21.02.2018 18:29:00
8 1 22.02.2018 08:32:00
9 1 22.02.2018 08:42:00
10 1 22.02.2018 17:00:00
11 1 22.02.2018 18:01:00
12 2 22.02.2018 08:20:00
13 2 22.02.2018 09:10:00
14 2 22.02.2018 17:50:00
What I want to do is
Id Personel_ID Date Login Time Logout Time
1 1 21.02.2018 07:31:00 18:15:00
2 2 21.02.2018 07:15:00 18:29:00
3 1 22.02.2018 08:32:00 18:01:00
4 2 22.02.2018 08:20:00 17:50:00
I want to get a Personel_ID's first record of a date as login time and last record of a date is logout time. I hope you understand
It could be:
Select
Personel_ID,
DateValue([DateTime]) As [Date],
Min(TimeValue([DateTime])) As [Login Time],
Max(TimeValue([DateTime])) As [Logout Time]
From
YourTable
Group By
Personel_ID,
DateValue([DateTime])
I've been working on a MySQL query that sorts data into weeks but I just can't figure out how to do it.
I would like to sort the data into weeks for the current and last 11 weeks. Each week will run from Monday 00:00:00 to Sunday 23:59:59.
(Taking todays date as 2014-12-04)...
Week 1: 2014-12-01 > 2014-12-07 - (Last Monday 00:00:00 to next Sunday 23:59:59)
Week 2: 2014-11-24 > 2014-11-30 - (Monday before last 00:00:00 to last Sunday 23:59:59)
Week 3: 2014-11-17 > 2014-11-23 - (Monday before before last 00:00:00 to last last Sunday 23:59:59)
And so on...
For each week the value field data will be totalled.
I need the data returned to be in the format:
datetime: The first date (Always a Monday) of that week.
value: The total of all the values in that week.
For example, the returned data:
Week 1: 2014-12-01 : Totalled value=11
Week 2: 2014-11-24 : Totalled value=3
Week 3: 2014-11-17 : Totalled value=9
Week 4: 2014-11-10 : Totalled value=7
Table_1 data:
table1id datetime value
1 2014-09-01 06:00:00 4
2 2014-09-04 17:00:00 6
3 2014-09-09 18:00:00 9
4 2014-09-15 07:00:00 4
5 2014-09-20 10:00:00 2
6 2014-09-25 10:00:00 3
7 2014-09-30 09:00:00 8
8 2014-10-01 14:00:00 5
9 2014-10-05 10:00:00 7
10 2014-10-09 18:00:00 3
11 2014-10-15 05:00:00 4
12 2014-10-20 07:00:00 8
13 2014-10-24 16:00:00 9
14 2014-10-29 15:00:00 5
15 2014-10-31 16:00:00 7
16 2014-11-05 09:00:00 2
17 2014-11-10 08:00:00 4
18 2014-11-15 16:00:00 3
19 2014-11-20 10:00:00 9
20 2014-11-25 10:00:00 2
21 2014-11-30 10:00:00 1
22 2014-12-01 15:00:00 7
23 2014-12-04 18:00:00 2
I 'could' just pull all the data unsorted for the date range using PHP and sort it from there but I'd rather the MySQL server do it.
Any suggestions would be greatly appreciated. :-)
based on generate days from date range
you can do smething like that:
select mondays.week, mondays.day, sum(value)
from
(select a.a+1 week, curdate() - WEEKDAY(curdate()) - INTERVAL (7*a.a) DAY as day from (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9 union all select 10 union all select 11) as a) as mondays,
Table_1
where Table_1.datetime between mondays.day and (mondays.day + interval(7) day)
group by mondays.week, mondays.day;