2016-12-16 162 views
0

我需要找到10歲年齡範圍內的最常見事件,這些年齡範圍可以是年齡2至22歲,15至25歲,10至20歲等,其中name & age找到一個年齡跨度的平均年齡範圍

我創建了返回的平均年齡在SQL:

SELECT age, count(age) 
FROM member 
GROUP BY age 
ORDER BY COUNT(age) DESC 
LIMIT 1 

感謝您的幫助!

+0

我不相信你可以用一個SQL調用來做到這一點。您可能想要對存儲過程和Transact SQL進行一些研究(取決於您使用的服務器) –

+0

添加您的表並顯示一些示例數據 – e4c5

+0

@PaulColdrey - Transact SQL不會很有用,因爲它們已標記問題'mysql' – Tony

回答

0

創建一個表ages舉行的年齡範圍,你有興趣與age_lowerage_upper場和顯示名稱age_range如「2至22」

加入表與放一個WHERE條款年齡在下限和上限之間。

SELECT `age_range`, COUNT(`age`) AS age_count 
FROM `member` INNER JOIN `ages` 
    ON age BETWEEN age_lower AND age_upper 
GROUP BY age_range 
ORDER BY COUNT(`age`) DESC, `age_range` ASC 

SQL Fiddle

+0

我會試試這個謝謝! – user3014571

+0

@ user3014571 - 我更正了SQL,它有語法錯誤,並添加了一個示例SQL小提琴。 – Tony

+0

不幸的是,這仍然使用該方案中定義的預定年齡範圍。 1-10,11-20等我需要它來生成這些範圍。年齡2至22歲,15至25歲,10至20歲等。 – user3014571

0

這可能會解決這個問題。我添加的唯一東西是一張表,其值爲1..x,其中x是您的存儲桶數量。 @T可以很容易地替換爲你的MySQL表名。每個年齡的結果都是可能的年齡數據。然後統計多少個相等的集合。

--IGNORE BUILDING TEST DATA IN SQL SERVER 
    DECLARE @T TABLE(member INT,age INT) 
    DECLARE @X INT 
    SET @X=1 
    WHILE(@X<=100) BEGIN 
     INSERT INTO @T SELECT @X, CAST(RAND() * 100 AS INT) 
     SET @[email protected]+1 
    END 

    DECLARE @MinAge INT=1 
    DECLARE @MaxAge INT=100 

    --YOUR SET TABLE. TO MAKE LIFE EASY YOU NEED A TABLE OF 1..X 
    DECLARE @SET TABLE (Value INT) 
    DECLARE @SET_COUNT INT =10 
    DECLARE @LOOP INT=1 
    WHILE(@LOOP<[email protected]_COUNT) BEGIN 
     INSERT @SET SELECT @LOOP 
     SET @[email protected]+1 
    END 

    SELECT 
     MinAge, 
     MaxAge, 
     SetCount=COUNT(CountFlag) 
    FROM 
    (
     SELECT 
      MinAge=AgeMinusSetCount, 
      MaxAge=AgePlusSetCount, 
      CountFlag=1 
     FROM 
     (
      SELECT DISTINCT 
       ThisAge, 
       AgeMinusSetCount=(AgeMinusSetCount-1) + Value, 
       AgePlusSetCount=CASE WHEN (AgeMinusSetCount-1) + Value + @SET_COUNT > @MaxAge THEN @MaxAge ELSE (AgeMinusSetCount-1) + Value + @SET_COUNT END 
      FROM 
      (
       SELECT 
        ThisAge=age, 
        AgeMinusSetCount=CASE WHEN (age - @SET_COUNT) < @MinAge THEN @MinAge ELSE (age) - @SET_COUNT END 
       FROM 
        @T  
      )RANGES  
      LEFT OUTER JOIN (SELECT Value FROM @SET) AS FanLeft ON 1=1 
     )AS DETAIL 
    )AS Summary 
    GROUP BY 
     MinAge, 
     MaxAge 
    ORDER BY 
     COUNT(CountFlag) DESC