571. Median frequency query for a given number
Ideas
The number of digits can be obtained by n = SUM (frequency),
Create two columns first. asc_frequency: record the number of numbers less than or equal to the current number; desc_frequency: record the number of numbers greater than or equal to the current number
The reason for this is that when we find the corresponding number in asc_frequency> = n / 2, and in desc_frequency> = n / 2.
If there are two, the average AVG (number) is median
step
- Create a temporary table t
2. Select the number corresponding to> = n / 2 in asc_frequency and> = n / 2 in desc_frequency
WHERE t.asc_frequency >= (SELECT SUM(Frequency) FROM Numbers)/2
AND t.desc_frequency >= (SELECT SUM(Frequency) FROM Numbers)/2
- If there are multiple numbers, return the average of Number
SELECT AVG(Number) AS median
FROM () t
WHERE ...
Code
SELECT AVG(Number) AS median
FROM (SELECT n1.Number, n1.Frequency,
(SELECT SUM(Frequency) FROM numbers n2 WHERE n2.Number<=n1.Number) AS asc_frequency,
(SELECT SUM(Frequency) FROM numbers n3 WHERE n3.Number>=n1.Number) AS desc_frequency
FROM numbers n1) t
WHERE t.asc_frequency >= (SELECT SUM(Frequency) FROM Numbers)/2
AND t.desc_frequency >= (SELECT SUM(Frequency) FROM Numbers)/2 ;