आप द्वारा चतुर्थक मान बना सकते हैं का उपयोग कर उन्हें स्थापित करने के लिए शून्य अगर गलत चतुर्थक में:
के मान लेते हैं, कच्चे डेटा तालिका
द्वारा बनाई गई है 0
DROP TABLE IF EXISTS `rawdata`;
CREATE TABLE `rawdata` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`url` varchar(250) NOT NULL DEFAULT '',
`time` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `time` (`time`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
(और आबादी आबादी)।
यह भी मान लें चतुर्थक तालिका डेटा
DROP TABLE IF EXISTS `quartiles`;
CREATE TABLE `quartiles` (
`url` varchar(250) NOT NULL,
`Q1` float DEFAULT '0',
`Q2` float DEFAULT '0',
`Q3` float DEFAULT '0',
`Q4` float DEFAULT '0',
PRIMARY KEY (`url`),
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
(और बाएँ खाली) द्वारा बनाई गई है करते हैं।
फिर rawdata से चतुर्थकों पॉप्युलेट करने के लिए एक प्रक्रिया की जा रही
DELIMITER ;;
CREATE PROCEDURE `ComputeQuartiles`()
READS SQL DATA
BEGIN
DECLARE numrows int DEFAULT 0;
DECLARE qrows int DEFAULT 0;
DECLARE rownum int DEFAULT 0;
DECLARE done int DEFAULT 0;
DECLARE currenturl VARCHAR(250) CHARACTER SET utf8;
DECLARE Q1,Q2,Q3,Q4 float DEFAULT 0.0;
DECLARE allurls CURSOR FOR SELECT DISTINCT url FROM rawdata;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET currenturl='';
OPEN allurls;
FETCH allurls INTO currenturl;
WHILE currenturl<>'' DO
SELECT COUNT(*) INTO numrows FROM rawdata WHERE url=currenturl;
SET qrows=FLOOR(numrows/4);
if qrows>0 THEN
-- Only session parameters can be recalculated inside a query,
-- so @rownum:[email protected]+1 will work, but rownum:=rownum+1 will not.
SET @rownum=0;
SELECT
SUM(IFNULL(QA,0))/qrows,
SUM(IFNULL(QB,0))/qrows,
SUM(IFNULL(QC,0))/qrows,
SUM(IFNULL(QD,0))/qrows
FROM (
SELECT
if(@rownum<qrows,time,0) AS QA,
if(@rownum>=qrows AND @rownum<2*qrows,time,0) AS QB,
-- the middle 0-3 rows are left out
if(@rownum>=(numrows-2*qrows) AND @rownum<(numrows-qrows),time,0) AS QC,
if(@rownum>=(numrows-qrows),time,0) AS QD,
@rownum:[email protected]+1 AS dummy
FROM rawdata
WHERE url=currenturl ORDER BY time
) AS baseview
INTO Q1,Q2,Q3,Q4
;
REPLACE INTO quartiles values (currenturl,Q1,Q2,Q3,Q4);
END IF;
FETCH allurls INTO currenturl;
END WHILE;
CLOSE allurls;
END ;;
DELIMITER ;
मुख्य बिंदु दिखाई देगा: चक्र के लिए यूआरएल एक कर्सर
- उपयोग करें (या नमूना अनुकूलन के रूप में URL स्वीकार करना एक पैरामीटर)
- प्रत्येक यूआरएल के लिए पंक्तियों की कुल संख्या
- मध्य पंक्तियों को छोड़ने के लिए कुछ मामूली गणित करें, यदि
(rowcount % 4) != 0
- URL के लिए सभी कच्चे पंक्तियों का चयन, गुणवत्ता आश्वासन-QD से एक के लिए
time
का मान निर्दिष्ट, पंक्ति संख्या के आधार पर, अन्य Qx मान 0
- उपयोग एक सबक्वेरी के रूप में इस प्रश्न के एक और एक, को बताए जो सार और चतुर्थकों तालिका अद्यतन करने के लिए
मैं 18,432 कच्चे पंक्तियाँ, url=concat('http://.../',floor(rand()*10)), time=round(rand()*10000)
एक 8x1.9GHz मशीन पर के साथ इस परीक्षण किया मूल्यों
उपयोग इस superquery के परिणाम को सामान्य और यह 0.50-0.54sec में लगातार समाप्त हो गया
जो सेल्को की 'एसक्यूएल फॉर स्मार्टज़' के पास एक अध्याय है आंकड़े (मोड, औसत, भिन्नता, आदि) यह खरीद मूल्य के लायक है। –