2

非常に単純な質問に答えるのに苦労しているため、これに取り組みすぎたと思います。小売環境で、クーポンを提供しているカテゴリにお金を費やしていない顧客は誰ですか?

次のデータを検討してください。

-- The offer ID and the category for which it is valid.
select * from t_offers
OFFER   CAT_NBR
foo34   34
xxx30   30
baz60   60
bar50   50

-- The customer ID (HH) and their total spending by all
-- categories (not just the ones for which coupons are being offered).
-- PLEASE NOTE that when a customer has zero spend, there will NOT be an
--             entry in this table for that category.
select * from t_catspend
HH  CAT_NBR SPEND
1   30      5
1   60      7
2   34      8

私が取得しようとしているのはこれです: の各オファーについて、そのオファーのカテゴリで支出していない各顧客t_offersのID。HHたとえば、オファー foo34 の場合、HH #1 にはそのカテゴリの支出が表示されないため、HH #1 を取得する必要があります (HH #1 のカテゴリ 34 のエントリはありません)。

したがって、null データを探すときの最初の本能は、外部結合です。というわけで、 で左結合してみましたcat_nbr。しかし、それでは実際に支出している顧客しか得られません。そのカテゴリで支出のない顧客の ID を教えてもらう方法がわかりません。

問題があれば、これは Netezza にあります。

助けてくれてありがとう。

4

4 に答える 4

4
SELECT  a.HH
FROM    t_catspend a
WHERE   NOT EXISTS
        (
            SELECT  null
            FROM    t_offers b
                    INNER JOIN t_catspend c
                        ON c.CAT_NBR = b.CAT_NBR
            WHERE   b.offer = 'foo34' AND
                    a.HH = c.HH
        )
GROUP   BY a.HH

出力

╔════╗
║ HH ║
╠════╣
║  1 ║
╚════╝

アップデート

SELECT  b.*, a.*
FROM    t_offers a
        CROSS JOIN (SELECT HH FROM t_catspend GROUP BY HH) b
        LEFT JOIN t_catspend x
          ON    a.CAT_NBR = x.CAT_NBR AND
                b.HH = x.HH
WHERE   x.CAT_NBR IS NULL
        -- AND a.offer = 'foo34'  -- <<== specific OFFER
ORDER   BY b.HH

出力

╔════╦═══════╦═════════╗
║ HH ║ OFFER ║ CAT_NBR ║
╠════╬═══════╬═════════╣
║  1 ║ bar50 ║      50 ║
║  1 ║ foo34 ║      34 ║
║  2 ║ baz60 ║      60 ║
║  2 ║ bar50 ║      50 ║
║  2 ║ xxx30 ║      30 ║
╚════╩═══════╩═════════╝

非常に巨大なテーブルがあると述べたので、化合物を追加するとINDEX、クエリの実行が高速になります。

ALTER TABLE t_catspend ADD INDEX (HH, CAT_NBR)

可能であればt_catspend.CAT_NBR参照する必要がありますt_offers.CAT_NBR

お役に立てれば。

于 2013-06-02T03:38:58.907 に答える
2

これを探していますか?

SELECT b.cat_nbr, b.hh 
  FROM
(
 SELECT cat_nbr, hh
   FROM t_offers CROSS JOIN 
 ( 
   SELECT DISTINCT hh FROM t_catspend
 ) a
) b LEFT JOIN t_catspend s
    ON b.cat_nbr = s.cat_nbr AND b.hh = s.hh
 WHERE s.spend IS NULL
 GROUP BY b.cat_nbr, b.hh

提供されたサンプル データに基づく出力:

| CAT_NBR | HH |
----------------
|      30 |  2 |
|      34 |  1 |
|      50 |  1 |
|      50 |  2 |
|      60 |  2 |

ここにSQLFiddleがあります

于 2013-06-02T03:54:32.467 に答える
0

これが効率的かどうかはわかりませんが、機能します。

SELECT DISTINCT HH, offer FROM t_offers, t_catspend
WHERE (HH, offer) NOT IN
(SELECT HH, offer FROM t_offers t1, t_catspend t2
WHERE t1.cat_nbr = t2.cat_nbr)
于 2013-06-03T02:24:30.230 に答える
0

あなたは正しい道を進んでいたと思います。おそらくWHERE基準がありませんか?

SELECT *
FROM t_catspend spend
LEFT JOIN t_offers offers
 ON spend.CAT_NBR = offers.CAT_NBR
WHERE offers.CAT_NBR IS NULL
于 2013-06-02T03:54:15.990 に答える