SELECT ROUND(SUM(T.tiv_2016), 2) as tiv_2016 FROM ( SELECT MAX(I1.tiv_2016) as tiv_2016 FROM Insurance I1 LEFTJOIN Insurance I2 ON I1.pid != I2.pid WHERE I1.pid IN ( SELECT pid FROM Insurance GROUPBY lat, lon HAVING COUNT(*) =1 ) AND I1.tiv_2015 = I2.tiv_2015 GROUPBY I1.pid ) T
SELECT ROUND(SUM(T.tiv_2016), 2) as tiv_2016 FROM ( SELECT I1.pid, MAX(I1.tiv_2016) as tiv_2016 FROM Insurance I1 LEFTJOIN Insurance I2 ON I1.pid != I2.pid AND I1.tiv_2015 = I2.tiv_2015 AND I1.pid IN ( SELECT pid FROM Insurance GROUPBY lat, lon HAVING COUNT(*) =1 ) GROUPBY I1.pid ) T
SELECT ROUND(SUM(T.tiv_2016), 2) as tiv_2016 FROM ( SELECT I1.pid, MAX(I1.tiv_2016) as tiv_2016 FROM Insurance I1 JOIN Insurance I2 ON I1.pid != I2.pid AND I1.tiv_2015 = I2.tiv_2015 AND I1.pid IN ( SELECT pid FROM Insurance GROUPBY lat, lon HAVING COUNT(*) =1 ) GROUPBY I1.pid ) T
思路2
count() + over(parition by)
count计算个数
partition by指定计算时的聚合方法
sql
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
SELECT ROUND(SUM(T.tiv_2016), 2) as tiv_2016 FROM ( SELECT tiv_2016, COUNT(1) OVER(PARTITIONBY tiv_2015) AS tiv_2015_cnt, COUNT(1) OVER(PARTITIONBY lat, lon) AS pos_cnt FROM Insurance ) T WHERE T.tiv_2015_cnt >1 AND T.pos_cnt =1
SELECT id, COUNT(friend_id) AS num FROM ( SELECT accepter_id AS id, requester_id AS friend_id FROM RequestAccepted UNIONALL SELECT requester_id AS id, accepter_id AS friend_id FROM RequestAccepted ) T GROUPBY id ORDERBY COUNT(friend_id) DESC LIMIT 1
SELECT id, SUM(num) AS num FROM ( SELECT accepter_id AS id, COUNT(requester_id) AS num FROM RequestAccepted GROUPBY accepter_id UNIONALL SELECT requester_id AS id, COUNT(accepter_id) AS num FROM RequestAccepted GROUPBY requester_id ) T GROUPBY id ORDERBY SUM(num) DESC LIMIT 1
( SELECT name AS results FROM Users JOIN MovieRating ON Users.user_id = MovieRating.user_id GROUPBY Users.user_id ORDERBY COUNT(rating) DESC,name LIMIT 1 ) UNIONALL ( SELECT title AS results FROM Movies JOIN MovieRating ON Movies.movie_id = MovieRating.movie_id WHERE created_at BETWEENDATE("2020-02-01") ANDDATE("2020-02-29") GROUPBY Movies.movie_id ORDERBY AVG(rating) DESC, title LIMIT 1 )
SELECT activity_date AS'day', COUNT(DISTINCT user_id) AS'active_users' FROM Activity WHERE activity_date BETWEEN DATE_SUB("2019-07-27", INTERVAL29DAY) AND DATE("2019-07-27") GROUPBY activity_date
# Write your MySQL query statement below SELECT patient_id, patient_name, conditions FROM Patients WHERE conditions LIKE'% DIAB1%' OR conditions LIKE'DIAB1%'
SELECT Sales.product_id, T.first_year, Sales.quantity, Sales.price FROM Sales JOIN ( SELECT product_id, MIN(year) AS first_year FROM Sales GROUPBY product_id ) T ON Sales.year = T.first_year AND Sales.product_id = T.product_id
rank
over里面既能partition by, 也能order by
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
SELECT T.product_id, T.first_year, T.quantity, T.price FROM ( SELECT product_id, yearAS first_year, quantity, price, rank() OVER(PARTITIONBY product_id ORDERBYyear) AS'year_rank' FROM Sales ) T WHERE T.year_rank =1