[SQL] Median query frequency for a given number

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

  1. 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 
  1. 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 ;

Guess you like

Origin www.cnblogs.com/wyz-2020/p/12677076.html