2013-10-10 31 views
1

我有以下问题:我需要在组中的中位数。组中的SQLITE中位数

示例:我有一个网络,它们之间有多个起点和终点以及多个移动距离。我现在需要每个开始/结束对的中位数。

为下表:

Start | End | Time 
     A | B | 5 
     A | B | 9 
     A | B | 6 
     B | C | 4 
     B | C | 8 
     C | A | 5 
     C | B | 6 

我想以下结果:

Start | End | Median(Time) 
     A | B | 6 
     B | C | 6 
     C | A | 5 
     C | B | 6 

我已经看到了如何计算中位数在这里:How can I calculate the median of values in SQLite?,但我不知道如何申请这对群体。

要创建表使用下面的代码:

CREATE TABLE "Times" ("Key" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL UNIQUE , "START" TEXT, "END" TEXT, "TIME" INTEGER); 
INSERT INTO "Times" VALUES(1,'A','B',5); 
INSERT INTO "Times" VALUES(2,'A','B',9); 
INSERT INTO "Times" VALUES(3,'A','B',6); 
INSERT INTO "Times" VALUES(4,'B','C',4); 
INSERT INTO "Times" VALUES(5,'B','C',8); 
INSERT INTO "Times" VALUES(6,'C','A',5); 
INSERT INTO "Times" VALUES(7,'C','B',6); 

任何帮助是极大的赞赏。

+0

只需添加'WHERE'条款后,每' FROM ...'! –

回答

0

我不能使它工作(你不能从LIMITOFFSET内访问外嵌套表接缝),但得到这样的回答:

SELECT Start, End, AVG(Time) FROM (
    SELECT *, (
     SELECT COUNT() FROM Times AS _ 
     WHERE Start=Times.Start AND End=Times.End AND (Time>Times.Time OR Time=Times.Time AND ROWID>Times.ROWID) 
    )-(
     SELECT COUNT() FROM Times AS _ 
     WHERE Start=Times.Start AND End=Times.End AND (Time<Times.Time OR Time=Times.Time AND ROWID<Times.ROWID) 
    ) AS m FROM Times WHERE m BETWEEN -1 AND 1 
) GROUP BY Start, End;