1

ファイルのダウンロード数を取得するクエリが必要です。テーブルはこんな感じ

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の値が異なり、ユーザーが登録されている場合はユーザーと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になります。

どんな助けでも大歓迎です。

編集:紛らわしいので、いくつかの説明を取り消し線で消します。すべてのコメントと可能な解決策をありがとう。

4

4 に答える 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フィドルの例#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フィドルの例#2

于 2012-07-22T16:55:26.997 に答える
0

次のようなものにする必要があります:

    SELECT count(distinct ip) FROM table WHERE fid = 21;
于 2012-07-22T16:38:31.097 に答える
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の個別の値」と同等です。すべての匿名ユーザーは同じユーザーIDを持っているため、ユーザーIDを個別に含めても違いはありません。

于 2012-07-22T16:40:11.193 に答える
0

説明とサンプルデータには相関関係がなく、「ユーザーとIPが登録されている場合は異なる値」と記載されていますが、IPが異なるにもかかわらず、登録されたユーザーのサンプルデータは1回しか表示されません。サンプルデータに基づいて、これは機能します。

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
于 2012-07-22T16:56:28.960 に答える