这里是我的SQL小提琴:http://sqlfiddle.com/#!2/90d45/3比较第一和最后一个SQL行用相同的ID
表方案:
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");
我想要得到的域ID的是,在排名上的第一项比较的计数到最后一项(按日期)。
所以在这种情况下,所有等级上升的计数应该是2(domain_id:1,2)。
domain_id 3不应包含在计数中,因为它只有一个条目。所以,可能需要一个子查询HAVING COUNT(*)> 1.
domain_id 4也不应该包括在计数中,除非我反转查询并希望排名下降。
我应该如何解决这个问题?我知道我需要子查询,但我不知道从哪里开始。 JSFiddle应该让你知道我卡在哪里。
尝试 - 它返回有效的行,而不是行数正确:
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
最终答案(两个选项更慢):
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
你能发布你的预期表结果吗? –
我以为我做到了? 结果应该是: 如果我希望所有关键字的排名都上升,结果应该是2. 如果我希望所有关键字排名下降,结果应该是1. 我们忽略domain_id 3,因为它只有一行。 –