2016-12-16 165 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