Dies könnte das Problem lösen. Die einzige Sache, die ich hinzufügte, war eine Tabelle, um Werte 1..x zu halten, in denen x deine Schaufelzahl ist. Das @T kann leicht durch Ihren MySQL-Tabellennamen ersetzt werden. Die Ergebnisse sind alle möglichen Sätze, in denen das Alter für jedes Alter fällt. Zählen Sie dann, wie viele gleiche Mengen Sie haben.
--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
Ich glaube nicht, dass Sie dies mit einem einzigen SQL-Aufruf tun können. Vielleicht möchten Sie etwas über gespeicherte Prozeduren und Transact SQL (je nachdem, welchen Server Sie verwenden) recherchieren. –
Ihre Tabelle hinzufügen und einige Beispieldaten anzeigen – e4c5
@PaulColdrey - Transact SQL wird nicht von großem Nutzen sein, da sie die markiert haben Frage 'mysql' – Tony