I am stuck with a select I have to do, I have a data base where a new claim file is registered in the table called “claims”, in this table every file is registered as follows :
Sorry, i have attached above a print screen with how the tables look, i don't know why are as bellow when i post it.
ClaimFileNumber || Vehicle number || ……. || OpeningDate
1 abc 20170302
2 bcd 20170302
3 efg 20170301
4 hij 20170301
I need a select which can help me to find out how many claim files are open on each day from when this year started until now, ordered by top 5 days for each month like for example, on the month of May we have: 20170506 - 300 claims, 20170511 – 295 claims, 20170509 – 200 claims etc.
Or it is ok a select which can give me the number of claims opened per day and order them desc.
The problem is that the date stored in table OpeningDate it is stored as numeric and not as date, this is the tricky part at least for me.
I cannot use a select like “select count (OpeningDate) from claim where openingdate = 20170302” for each day because there are more than 200 days from when the year have started.
Thank you in advance for your help.
This should do it:
SELECT OpeningDate, COUNT(OpeningDate)
FROM claim
WHERE LEFT(OpeningDate, 4) = '2017'
GROUP BY OpeningDate
ORDER BY OpeningDate ASC, COUNT(OpeningDate) DESC
You need group by:
select OpeningDate,count(1) from your_table group by OpeningDate
For top 5, you need order by and limit
select OpeningDate,count(1)
from your_table
group by OpeningDateorder
order by 2 desc
limit 5
Related
I wanted to know how would i count most donated number for a person and how to make list from most donator to the lowest.
Database looks like this :
- Donated Amount - Payer Email
- 10 123456#hotmail.com
- 5 125643#hotmail.com
- 5 123456o#gmail.com
- 20 6653211#live.de
- 5 1256431#live.de
- 10 6558714#gmail.com
Note : If anyone would guide me on how the table is made on stackoverflow, thank you.
The easiest is to group by the email, sum the amount to get a total, and order by descending total.
SELECT
`Payer Email`,
SUM(`Donated Amount`) AS DonatedAmount
-- , COUNT(*) AS TimesDonated
-- , MAX(`Donated Amount`) AS BiggestDonation
FROM YourDonationsTable
GROUP BY `Payer Email`
ORDER BY DonatedAmount DESC
And if you want only the top 3 of those, add a LIMIT 3 at the end of the SQL.
I'm at a loss and hoping for some help. I've searched SOF, google and tried as many things as I can think but can't get anything even close to what I'm after (so far away there is no point in posting my attempts).
results table
result_id
wcics_live_id
class_id
main
round_num
results_drivers table
rd_id
result_id
user_id
race_time (ex. 5:06.231, this is minutes:seconds)
laps (ex. 25)
For each class_id a driver will have 3 entries in the results_drivers table, for example:
Luke Pittman 25 laps 5:06.231
Luke Pittman 24 laps 5:00.691
Luke Pittman 25 laps 5:05.914
Additionally, each class will have multiple drivers - could be as many as 40 or 50.
I need to be able to gather a list of all the drivers, in order of the fastest time (highest laps with lowest race_time), but only returning one result for each driver. For example:
Faster Guy 26 laps 5:11.134
Luke Pittman 25 laps 5:05.914
Joe Doe 25 laps 5:06.014
Other Guy 24 laps 5:00.141
... and so on
Normally I would do a group by with a max value (or something similar) on a column, but I have no idea how to make that happen with 2 separate columns.
I'd do a query with MAX(laps) ... GROUP BY user_id, and then reference that as an inline view in another query, to get the minimum race_time
Something like this:
SELECT ft.user_id
, ft.laps
, MIN(ft.race_time) AS race_time
FROM ( -- maximum laps
SELECT dr.user_id
, MAX(dr.laps) AS max_laps
FROM driver_results dr
GROUP BY dr.user_id
) ml
JOIN driver_results ft
ON ft.user_id = ml.user_id
AND ft.laps = ml.laps
GROUP
BY ft.user_id
, ft.laps
ORDER
BY laps ASC
, race_time DESC
(I'm assuming here that the laps and race_time columns are canonical, such that ORDER BY and MIN/MAX will work to get the highest number of laps and fastest time. If these are stored as strings, then it won't necessarily work right. i.e. if comparing strings: '10:23.456' will be less than '8:15.555'.
I have a data set like this:
User Date Status
Eric 1/1/2015 4
Eric 2/1/2015 2
Eric 3/1/2015 4
Mike 1/1/2015 4
Mike 2/1/2015 4
Mike 3/1/2015 2
I'm trying to write a query in which I will retrieve users whose MOST RECENT transaction status is a 4. If it's not a 4 I don't want to see that user in the results. This dataset could have 2 potential results, one for Eric and one for Mike. However, Mike's most recent transaction was not a 4, therefore:
The return result would be:
User Date Status
Eric 3/1/2015 4
As this record is the only record for Eric that has a 4 as his latest transaction date.
Here's what I've tried so far:
SELECT
user, MAX(date) as dates, status
FROM
orders
GROUP BY
status,
user
This would get me to a unqiue record for every user for every status type. This would be a subquery, and the parent query would look like:
SELECT
user, dates, status
WHERE
status = 4
GROUP BY
user
However, this is clearly flawed as I don't want status = 4 records IF their most recent record is not a 4. I only want status = 4 when the latest date is a 4. Any thoughts?
SELECT user, date
, actualOrders.status
FROM (
SELECT user, MAX(date) as date
FROM orders
GROUP BY user) AS lastOrderDates
INNER JOIN orders AS actualOrders USING (user, date)
WHERE actualOrders.status = 4
;
-- Since USING is being used, there is not a need to specify source of the
-- user and date fields in the SELECT clause; however, if an ON clause was
-- used instead, either table could be used as the source of those fields.
Also, you may want to rethink the field names used if it is not too late and user and date are both found here.
SELECT user, date, status FROM
(
SELECT user, MAX(date) as date, status FROM orders GROUP BY user
)
WHERE status = 4
The easiest way is to include your order table a second time in a subquery in your from clause in order to retrieve the last date for each user. Then you can add a where clause to match the most recent date per user, and finally filter on the status.
select orders.*
from orders,
(
select ord_user, max(ord_date) ord_date
from orders
group by ord_user
) latestdate
where orders.ord_status = 4
and orders.ord_user = latestdate.ord_user
and orders.ord_date = latestdate.ord_date
Another option is to use the over partition clause:
Oracle SQL query: Retrieve latest values per group based on time
Regards,
I have a table storing the scores (with the date) of players they did at each game.
Example:
john 154 10/02/2014
mat 178 09/02/2014
eric 270 08/02/2014
mat 410 07/02/2014
john 155 06/02/2014
In this example I want "eric 270 08/02/2014" because thins is the oldest of the most recents.
Which request must I do to retrieve that ?
As I understand it, you request the oldest entry among the set containing the most recent one of each user.
In such a case, you can deal with your problem using a subquery given the last date for each user, then used in the main query to select and sort only the most recent entry of each user.
SELECT scores.*
FROM scores
INNER JOIN
(
SELECT max(date) last, name
FROM scores
GROUP BY name
) last_temp_table
ON scores.name = last_temp_table.name
AND scores.date = last_temp_table.last
ORDER BY scores.date ASC LIMIT 1;
More info in different SO threads such as MySQL order by before group by
The question as worded doesn't make much sense unless you define most recent.
If I assume that you have some criteria like: "Give the oldest event that happened within the last 3 days" then that is a simple matter of ordering and limiting across a date range.
select * from events where ts >= CURDATE() - 3
order by ts asc
limit 1
While very easy to do in Perl or PHP, I cannot figure how to use mysql only to extract the first unique occurence of a record.
For example, given the following table:
Name Date Time Sale
John 2010-09-12 10:22:22 500
Bill 2010-08-12 09:22:37 2000
John 2010-09-13 10:22:22 500
Sue 2010-09-01 09:07:21 1000
Bill 2010-07-25 11:23:23 2000
Sue 2010-06-24 13:23:45 1000
I would like to extract the first record for each individual in asc time order.
After sorting the table is ascending time order, I need to extract the first unique record by name.
So the output would be :
Name Date Time Sale
John 2010-09-12 10:22:22 500
Bill 2010-07-25 11:23:23 2000
Sue 2010-06-24 13:23:45 1000
Is this doable in an easy fashion with mySQL?
I think that something along the lines of
select name, date, time, sale from mytable order by date, time group by name;
will get you what you're looking for
you need to perform a groupwise max or groupwise min
see below or http://pastie.org/973117 for an example
select
u.user_id,
u.username,
latest.comment_id
from
users u
left outer join
(
select
max(comment_id) as comment_id,
user_id
from
user_comment
group by
user_id
) latest on u.user_id = latest.user_id;
In databases, there really is no "first" or "last" record; think of each record as its own, non-positional entity in the table. The only positions they have are when you give them one, say, using ORDER BY.
This will give you what you want. It might not be efficient, but it works.
select Name, Date, Time, Sale from
(select Name, Date, Time, Sale from MyTable
order by Date asc, Time asc) MyTable_subquery_name
group by Name
Note: MyTable_subquery_name is just a dummy name for the subquery. MySQL will give the error ERROR 1248 (42000): Every derived table must have its own alias without it.
If only GROUP BY and ORDER BY were communicative operations, then this wouldn't have to be a subquery.