EQL allows you to group your data into quartiles.
/* This finds quartiles in the range * of ProductSubCategory, arranged by * total sales. Adjust the grouping * attribute and metric to your use case. */ DEFINE Input AS SELECT ProductSubcategoryName AS Key, SUM(FactSales_SalesAmount) AS Metric FROM SaleState GROUP BY Key ORDER BY Metric; DEFINE Quartile1Records AS SELECT Key AS Key, Metric AS Metric FROM Input ORDER BY Metric PAGE(0, 25) PERCENT; /* Using MAX(Metric) as the Quartile boundary isn't quite * right: if the boundary falls between two records, the * quartile is the average of the values on those two records. * But this gives the right groupings. */ DEFINE Quartile1 AS SELECT MAX(Metric) AS Quartile, SUM(Metric) AS Metric /* ...or any other aggregate */ FROM Quartile1Records GROUP; DEFINE Quartile2Records AS SELECT Key AS Key, Metric AS Metric FROM Input ORDER BY Metric PAGE(25, 25) PERCENT; DEFINE Quartile2 AS SELECT MAX(Metric) AS Quartile, SUM(Metric) AS Metric FROM Quartile2Records GROUP; DEFINE Quartile3Records AS SELECT Key AS Key, Metric AS Metric FROM Input ORDER BY Metric PAGE(50, 25) PERCENT; DEFINE Quartile3 AS SELECT MAX(Metric) AS Quartile, SUM(Metric) AS Metric FROM Quartile3Records GROUP; DEFINE Quartile4Records AS SELECT Key AS Key, Metric AS Metric FROM Input ORDER BY Metric PAGE(75, 25) PERCENT; DEFINE Quartile4 AS SELECT MAX(Metric) AS Quartile, SUM(Metric) AS Metric FROM Quartile4Records GROUP; /** * The technical definition of "Quartile" is * the values that segment the data into four * roughly equal groups. Here, we return not * just the Quartiles, but the metric aggregated * over the records within the groups defined * by the Quartiles. */ RETURN Quartiles AS SELECT Quartile AS Quartile1, Metric AS Quartile1Metric, Quartile2[].Quartile AS Quartile2, Quartile2[].Metric AS Quartile2Metric, Quartile3[].Quartile AS Quartile3, Quartile3[].Metric AS Quartile3Metric, Quartile4[].Quartile AS Quartile4, Quartile4[].Metric AS Quartile4Metric FROM Quartile1;