1

これが私の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
4

2 に答える 2

1

最も単純な方法ではないかもしれませんが、たとえば、サブクエリを使用して domain_id ごとに最小および最大の日付を取得し、通常の結合を使用して対応する行を取得できます。その後、最後にランクを比較できます。

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) 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

別のバージョンでは、LEFT JOINS を使用して最初と最後の行を除外し、ランクを比較します。

SELECT COUNT(a.domain_id) cnt
FROM domain_rankings a JOIN domain_rankings b
  ON a.domain_id = b.domain_id AND a.rank < b.rank
LEFT JOIN domain_rankings c
  ON a.domain_id = c.domain_id AND a.create_date > c.create_date
LEFT JOIN domain_rankings d
  ON b.domain_id = d.domain_id AND b.create_date < d.create_date
WHERE c.domain_id IS NULL and d.domain_id IS NULL;

両方の SQLfiddle

于 2013-10-10T19:46:56.943 に答える
0
SELECT count(*)
FROM TABLE AS a
INNER JOIN TABLE AS b ON a.domain_id=b.domain_id
AND a.date=b.date-interval 2 DAY
AND a.rank<b.rank
于 2013-10-10T19:47:12.553 に答える