これが私のSQLフィドルです:http://sqlfiddle.com/#!2/90d45/3
テーブル スキーム:
CREATE TABLE domain_rankings (domain_id int, rank int, create_date datetime);
INSERT INTO domain_rankings VALUES (1, 0, "2012-01-01");
INSERT INTO domain_rankings VALUES (1, 2, "2012-01-02");
INSERT INTO domain_rankings VALUES (1, 1, "2012-01-03");
INSERT INTO domain_rankings VALUES (2, 0, "2012-01-01");
INSERT INTO domain_rankings VALUES (2, 1, "2012-01-02");
INSERT INTO domain_rankings VALUES (2, 2, "2012-01-03");
INSERT INTO domain_rankings VALUES (3, 1, "2012-01-01");
INSERT INTO domain_rankings VALUES (4, 3, "2012-01-01");
INSERT INTO domain_rankings VALUES (4, 2, "2012-01-02");
INSERT INTO domain_rankings VALUES (4, 1, "2012-01-03");
最初のエントリと最後のエントリを比較して、ランクが上がる domain_id の数を (日付別に) 取得したいと考えています。
したがって、この場合、上昇するすべてのランクのカウントは 2 (domain_id: 1, 2) になります。
domain_id 3 は、エントリが 1 つしかないため、カウントに含めるべきではありません。したがって、おそらく HAVING COUNT(*) > 1 のサブクエリが必要です。
domain_id 4 も、クエリを逆にしてランクを下げたい場合を除き、カウントに含めるべきではありません。
この問題を解決するにはどうすればよいですか?サブクエリが必要になることは承知していますが、どこから始めればよいかわかりません。JSFiddle は、私が行き詰まっている場所のアイデアを提供するはずです。
Attempts - これは有効な行を返しますが、行の COUNT は正しく返しません。
SELECT domain_id, COUNT(DR.domain_id)
FROM domain_rankings DR
WHERE
(SELECT rank
FROM domain_rankings
WHERE domain_rankings.domain_id = DR.domain_id
ORDER BY create_date ASC LIMIT 1
) > (
SELECT rank
FROM domain_rankings
WHERE domain_rankings.domain_id = DR.domain_id
ORDER BY create_date DESC LIMIT 1
)
GROUP BY DR.domain_id
HAVING count(*) > 1
最終的な答え (2 つのオプションのうち遅い方):
SELECT COUNT(a.domain_id) cnt
FROM (
SELECT domain_id,MIN(create_date) mind, MAX(create_date) maxd
FROM domain_rankings
GROUP BY domain_id
HAVING COUNT(*) > 1
) master
JOIN domain_rankings a
ON a.domain_id = master.domain_id
AND a.create_date = master.mind
JOIN domain_rankings b
ON b.domain_id = master.domain_id
AND b.create_date = master.maxd
WHERE a.rank < b.rank