0

私の問題を明確にすることができることを願っています。

テーブルtweets内の各データの情報を抽出したいというdaterangeテーブルがあります。このテーブルには 142 の日付が含まれており、そのうち 102 の日付のプロパティtrading(市場が開かれた日) が 1 に設定されています ( trading=1)。

tweets以下のクエリは、表から 20 社 ( で識別)の情報を抽出しますsp100_id。したがって、予想される結果セットには 20 x 102 = 2,040 行が含まれます。ただしtweets、一部の日付と会社の組み合わせではテーブルにデータが保持されないため、1,987 行しか返されません。ただし、これらの「空の日」を結果セットに含める必要があります。を使用してこれを達成できると思っていましたが、データがない場合COALESCE(X, 0)は戻りますが、結果は同じで、1,987 行です。0

この情報と以下のクエリに基づいて、テーブル内の各行daterange._dateに対して102 行 (それぞれ 1 行trading=1)を返す方法を知っている人はいますか?sp100_idtweets

SELECT
  sp100.sp100_id,
  daterange._date,
  COALESCE(SUM(IF(tweets.classify1=2, tweets.`retweet_count`, 0)),0) AS `pos-retweet`,
  COALESCE(SUM(IF(tweets.classify1=2, tweets.`user-quality`,  0)),0) AS `pos-quality`,
  COALESCE(SUM(IF(tweets.classify1=2, tweets.`follow`,        0)),0) AS `pos-follow`,
  COALESCE(SUM(IF(tweets.classify1=3, tweets.`retweet_count`, 0)),0) AS `neg-retweet`,
  COALESCE(SUM(IF(tweets.classify1=3, tweets.`user-quality`,  0)),0) AS `neg-quality`,
  COALESCE(SUM(IF(tweets.classify1=3, tweets.`follow`,        0)),0) AS `neg-follow`
FROM
  sp100
CROSS JOIN
  daterange
LEFT JOIN
  tweets
  ON tweets.nyse_date = daterange._date
  AND tweets.sp100_id  = sp100.sp100_id
WHERE sp100.sp100_id BETWEEN 1 AND 20 AND tweets.type != 1 AND daterange.trading = 1
GROUP BY
  sp100.sp100_id, daterange._date

それ以外の場合は、SQLFiddle を提供しますが、SQLFiddle に使用されるテーブルの適切な部分をエクスポートするのは大変な作業ですが、実際の SQL の達人には解決策が明らかな場合があります :-)

4

2 に答える 2

2

tweets.type != 1問題は、WHERE句でそれを要求することから生じます。

関連付けられたツイートがない日付の場合、外部結合によりtweets、 を含むすべての列がtweets.typeになりますNULLWorking with NULLValuesに記載されているとおり:

との算術比較の結果も であるため、NULLこのNULLような比較から意味のある結果を得ることができません。

MySQL では、0orNULLは false を意味し、それ以外は true を意味します。ブール演算のデフォルトの真理値は です1

したがって、そのようなレコードはWHERE句によってフィルタリングされます。

@Martin Smith がコメントしたように、このフィルター条件を外部結合の句に移動できます (シミュレートされたレコードではなくON実際のレコードに対してのみテストが実行されるように)。tweetsNULL

または、フィルタを handle に書き換えることもできますNULL。たとえば、NULL-safe 等値演算子を使用すると、次のようになります。

NOT tweets.type <=> 1

余談ですが、私は通常daterangeテーブルを気にせず、代わりに結果セットからデータがない日付を省略します。代わりに、アプリケーション コード内で欠落している日付を処理します。

于 2012-09-03T00:01:15.283 に答える
0

毎日いっぱいのカレンダーテーブルが必要です。ばかげているように聞こえるかもしれませんが、このソリューションは多くの問題を解決します。整数(整数テーブル)でも同じソリューションを使用できます

于 2012-09-02T20:52:02.997 に答える