0

タグの他に、可能であればクエリでこれを解決したいと思います。私はこのテーブルを持っています

activity_type | value | date       | company_id
network.new   | 1     | 2011-10-08 | 1
members.count | 3     | 2011-10-08 | 1
network.new   | 1     | 2011-10-10 | 2
network.new   | 1     | 2011-10-11 | 3
members.count | 4     | 2011-10-11 | 2
  • これは基本的にログアクティビティです。
  • 'network.new'アクティビティは、company_idごとに1回だけ発生します
  • 「members_count」アクティビティは、「network.new」がcompany_idごとに表示された後にのみ発生し、company_idごとに1日1回表示できます。

X軸が日付、Y軸が2つの量である折れ線グラフを作成する必要があります。

  1. 初めてアクティビティの毎日のメンバーを持つcompany_idの数(それは私に苦労しているものです)。
  2. network.newアクティビティがあり、特定の日にそのアクティビティのみが存在する数。

私が試したすべてのクエリで、誤検知リストが表示されました。これは主に、毎日「members_count」アクティビティを持つcompany_idをカウントするためです。

可能であれば、目的のためにdate、first_time_members、new_company列を取得するクエリを作成したいと思いcreate viewます。私の質問が十分に明確であり、私の問題に近いものがどこにも見つからなかったので、ばかげていないことを願っています。

[編集]

私の英語は本当に下手なので、私は自分自身を明確にすることができませんでした。

私のクライアントは企業のネットワークを持っており、毎日何社の企業がネットワークに参加しているかを知りたいと思っていますが、落とし穴があります。ネットワークにサインインする企業は、メンバーが登録されている場合にのみ完成した企業と見なされます。そこで彼は、「不完全な」サインアップを行う企業の数と、「完全な」サインアップを行う企業の数を知りたいと考えています。

オリー・ジョーンズ氏は私を正しい方向に導いてくれました。彼が私を苦しめたものを使うことができると思いますが、それはまだ正しくありません。ちなみにあなたの答えをオーリージョーンズに感謝します。あなたのような答えは私にこのサイトを愛させました。

4

2 に答える 2

1

首を突き出して、あなたが欲しいものを推測します。あなたは「初めて活動する毎日のメンバーを持つcompany_idの数」を求めています。ちなみに、これは理解するのが非常に難しいステートメントです。

これはつまり、毎日、network.newアクティビティタイプに初めて表示されるcompany_id値の数と、その同じ日にゼロ以外のmembers.countアイテムが付随する値の数とその数です。いいえ?

これがあなたがすることです:

まず、システムに表示される各会社の最初の日付を示すクエリについて考えます。これを試して。

SELECT MIN(date) networknewdate, company_id
  FROM table
 WHERE activity_type = 'network.new'
 GROUP BY company_id

これにより、networknewdate、company_idの仮想テーブルが生成されます。

次に、各企業のmembers.countアイテムが最初に表示される日付を指定するクエリが必要です。

   SELECT MIN(date) memberscountdate, company_id
     FROM table
    WHERE activity_type = 'members.count'
    GROUP BY date

これで、company_id値ごとに最大で1つの行を持つ2つの優れた仮想テーブルができました。それらを結合して、最初の(network.new)値から結合を推進してみましょう。

  SELECT a.networknewdate, 
         a.company_id,
         IFNULL(b.members_present, 'no') members
    FROM (
      SELECT MIN(date) networknewdate, company_id
        FROM table
       WHERE activity_type = 'network.new'
       GROUP BY company_id
    ) a
    LEFT JOIN (
     SELECT MIN(date) memberscountdate, company_id, 'yes' members_present
       FROM table
      WHERE activity_type = 'members.count'
      GROUP BY date
    ) b ON (a.networknewdate = b.memberscountdate and a.company_id = b.company_id)

これにより、date、company_id、および「yes」または「no」の3つの列が返され、各company_idの最初のnetwork.newレコードと同じ日に最初のmembers.countレコードがあったかどうかが示されます。

次に、この全体を要約して、「はい」の数と「いいえ」の項目の数をリストした1日あたり1つのレコードを取得する必要があります。どうぞ。

日ごとの「yes」レコードの数。

SELECT networknewdate, count(*) yesrecords
  FROM (
      SELECT a.networknewdate, 
             a.company_id,
             IFNULL(b.members_present, 'no') members
        FROM (
          SELECT MIN(date) networknewdate, company_id
            FROM table
           WHERE activity_type = 'network.new'
           GROUP BY company_id
        ) a
        LEFT JOIN (
         SELECT MIN(date) memberscountdate, company_id, 'yes' members_present
           FROM table
          WHERE activity_type = 'members.count'
          GROUP BY date
        ) b ON (a.networknewdate = b.memberscountdate and a.company_id = b.company_id)
     ) r
 WHERE r.members = 'yes'
 GROUP BY networknewdate

日付ごとのレコードなしの数も同様のクエリです。次に、これら2つのクエリをnetworknewdateで左結合して、日付、yesrecords、norecordsのテーブルを取得する必要があります。これは、カットアンドペーストの演習として残しておきます。私が書いたクエリの2倍以上の長さで終わりますGROUP BY networknewdate

実世界のビジネスロジックを実装するSQLへようこそ!この質問に関する持ち帰りの教訓は、実際には特定するのが非常に難しい結果を求めているということだと思います。必要なものを正確に指定したら、それを取得するためのクエリを作成するのは面倒で反復的ですが、難しくはありません。

もう一つの小さなヒント。クエリがそれほど大きくならないように、いくつかのビューを作成することは理にかなっているかもしれません。

于 2012-05-29T01:35:46.130 に答える
1

したがって、同じアプローチを使用して、Ollie jonesは、私がそれを理解することを示しました。最初に、「members_count」または「network.new」が発生する日付のリストが必要です。

SELECT date as current_date
FROM activity_log ld
WHERE `activity_type` in ('members_count', 'network.new')
GROUP BY date
ORDER BY date

私が去った彼らは最初のデートの会社のリストで参加します

SELECT MIN(date) AS new_date, company_id
FROM activity_log
WHERE activity_type =  'network.new'
GROUP BY company_id
ORDER BY date

また、会社がメンバーを数えるのは初めて参加します

    SELECT min(date) as members_count_date, company_id 
FROM `activity_networks` WHERE `activity_type` = 'network.daily.members_count'
GROUP BY company_id 
ORDER BY date

次に、新しい会社と、初めてメンバーを数える会社を、日付ごとにグループ化して明確に数えます。それから私はこれを持っています:

    SELECT DATE(FROM_UNIXTIME(ld.date)) as curr_date,
COUNT(DISTINCT(new_co)) as new_co,
COUNT(DISTINCT(complete_co)) as complete
FROM activity_log ld 
LEFT JOIN (SELECT date AS new_date, company_id as new_co
FROM activity_networks
WHERE activity_type =  'network.new'
GROUP BY company_id
ORDER BY date) nd ON (ld.date=nd.new_date)
LEFT JOIN (SELECT min(date) as members_count_date, company_id as complete_co
FROM `activity_log` WHERE `activity_type` = 'members_count'
GROUP BY company_id 
ORDER BY date) mcd ON (mcd.members_count_date=ld.date)
WHERE `activity_type` in ('members_count', 'network.new')
GROUP BY DATE(FROM_UNIXTIME(ld.date))
ORDER BY ld.date

明確な機能は、それなしではカウントが正しく行われなかったため、非常に重要でした。完璧ではありません。私が名前を付けた列'new_co'は、不完全な登録(不完全な手段、会社にリンクされたメンバーがいない新しい登録)のみを表示する必要がありますが、それでも情報は役立つ可能性があります。

于 2012-05-29T15:13:31.190 に答える