2012-07-22 70 views
1

我需要一個查詢,它將獲得文件的下載次數。表是這樣的下載次數SQL查詢

fid uid  ip 
21 0  111.111.111.11 
21 0  222.222.222.22 
21 0  111.111.111.11 
21 1  333.333.333.33 
21 1  111.111.111.11 
21 1  444.444.444.44 
21 2  555.555.555.55 
22 0  111.111.111.11 

uid是用戶ID,如果它是0用戶是匿名的。 查詢應計算其中fid爲21 的行數,但如果用戶是匿名的,並且ips的值不同,並且用戶的註冊值不同(如果用戶下載文件,註銷並以匿名方式下載,查詢應該算成1個下載)

在這個例子中,查詢應該算作是這樣

fid uid  ip 
21 0  111.111.111.11 
21 0  222.222.222.22 
21 1  333.333.333.33 
21 2  555.555.555.55 

和結果應該是4

任何幫助深表感謝。

編輯:我刪除了一些描述,因爲它很混亂。 感謝您的所有意見和可能的解決方案。

回答

1

該查詢得到您想要的分組,但我不知道確定333.333.333.33應該返回uid=1的業務規則。我選擇使用MAX(ip)代替:

select distinct t.uid, t.ip 
from MyTable t 
inner join (
    select uid, max(ip) maxip 
    from MyTable 
    where fid = 21 
    group by uid 
) tm on t.uid = tm.uid 
and ((t.uid <> 0 and t.ip = tm.maxip) or t.uid = 0) 
where t.fid = 21 

SQL Fiddle Example #1

然後,您可以把它包裝在一個數,像這樣:

select count(*) 
from (
    select distinct t.uid, t.ip 
    from MyTable t 
    inner join (
    select uid, max(ip) maxip 
    from MyTable 
    where fid = 21 
    group by uid 
) tm on t.uid = tm.uid 
    and ((t.uid <> 0 and t.ip = tm.maxip) or t.uid = 0) 
    where t.fid = 21 
) a 

SQL Fiddle Example #2

+0

我會用這個。謝謝! – elektricni 2012-07-22 23:07:14

0

應該是這樣的:

SELECT count(distinct ip) FROM table WHERE fid = 21; 
0

下面的查詢應該做你需要的東西:

select fid, count(*) as uipcount, sum(rowcount) as rowcount 
from (select fid, userid, ip, count(*) as rowcount 
     from t 
     where fid = 21 
     group by fid, userid, ip 
    ) tsum 
group by fid 

領域uipcount是你在找什麼。它還包括原始數據中的總行數,作爲獎勵。

順便說一下,如果用戶是匿名的,用戶的獨特價值和ips,如果他們註冊了,則條件「ips的不同值」相當於「用戶和IPS的不同值」。所有匿名用戶具有相同的用戶標識,因此將他們的用戶標識包括在不同的標識中並沒有什麼不同。

0

你的解釋,你的樣本數據做不相關,你陳述「用戶和ips,如果他們註冊的不同價值」,但它的樣本數據註冊用戶只顯示一次儘管有不同的IP。根據您的樣本數據,這將工作:

SELECT COUNT(DISTINCT CASE WHEN UID = 0 THEN IP ELSE CAST(UID AS VARCHAR) END) AS UniqueDownloads, 
     COUNT(*) AS TotalDownloads 
FROM T 
WHERE FID = 21 

但是根據您的描述,這將工作:

SELECT COUNT(*) AS UniqueDownloads, 
     SUM(Downloads) AS TotalDownloads 
FROM ( SELECT UID, IP, COUNT(*) AS Downloads 
      FROM T 
      WHERE FID = 21 
      GROUP BY UID, IP 
     ) T