0

さまざまな Web サイトの毎日のメトリックを格納するテーブルがあります。テーブルの例:

ドメイン統計

|DomainId |     StatPullTime    | Visits |
+---------+---------------------+--------+
    1     | 2013-06-20 00:00:00 |  500   |
    1     | 2013-06-21 00:00:00 |  500   |
    1     | 2013-06-22 00:00:00 |  500   |
    1     | 2013-06-23 00:00:00 |  500   |
    1     | 2013-06-24 00:00:00 |  500   |
    1     | 2013-06-25 00:00:00 |  500   |
    1     | 2013-06-26 00:00:00 |  500   |
    1     | 2013-06-27 00:00:00 |  1000  |

したがって、今日の日付から開始し、訪問の合計が 2999 を超えるまで毎日戻るクエリを作成する必要があります。

例のテーブルでは、2013-06-23 が返されます。

これは私が考えることができる最も近いものです:

SELECT SUM(Visits) AS Visits, StatPullTime
FROM DomainStats
GROUP BY StatPullTime HAVING SUM(Visits) > 2999
4

2 に答える 2

0

純粋な SQL でこれを行う方法は次のとおりですが、レコードが非常に遠くまでさかのぼると、非常に非効率になる可能性があります。

SELECT a.DomainId DomainId, a.StatPullTime StatPullTime, SUM(b.Visits) Visits
FROM DomainStats a
JOIN DomainStats b ON a.DomainId = b.DomainId AND b.StatPullTime >= a.StatPullTime
GROUP BY DomainId, StatPullTime
HAVING Visits < 3000
ORDER BY DomainId, StatPullTime DESC

これが遅い理由は、O(N 2 ) 自己結合を実行するためです。@Tomasの答えはより実用的です。

于 2013-06-27T18:50:00.630 に答える
0

MySQL のみの線形のワンパス ソリューション (つまり、非常に効率的ですが、厳密な SQL には準拠していません):

set @sum_visits := 0, @domain_id = -1;

SELECT 
    @sum_visits := if(@domain_id = DomainId, @sum_visits, 0) + Visits AS SUM_Visits,
    @domain_id := DomainId as DomainId,
    StatPullTime,
FROM DomainStats
GROUP BY DomainId, StatPullTime
ORDER BY DomainId asc, StatPullTime desc
HAVING SUM_Visits <= 2999
于 2013-06-27T18:50:39.973 に答える