4

問題に対するSQLクエリの準備。

CREATE TABLE right_data(RID NUMBER(9,0), STATUS NUMBER(2,0));
CREATE TABLE left_data(LID NUMBER(9,0), URL VARCHAR(70 BYTE));
CREATE TABLE left_to_right(LID NUMBER(9,0), RID NUMBER(9,0));

INSERT INTO right_data (RID, STATUS) VALUES (1,0);
INSERT INTO right_data (RID, STATUS) VALUES (2,1);
INSERT INTO right_data (RID, STATUS) VALUES (3,0);
INSERT INTO right_data (RID, STATUS) VALUES (4,0);
INSERT INTO right_data (RID, STATUS) VALUES (5,1);

INSERT INTO left_data (LID, URL) VALUES (1,'data_1');
INSERT INTO left_data (LID, URL) VALUES (2,'data_2');
INSERT INTO left_data (LID, URL) VALUES (3,'data_3');
INSERT INTO left_data (LID, URL) VALUES (4,'data_4');
INSERT INTO left_data (LID, URL) VALUES (5,'data_5');

INSERT INTO left_to_right (LID, RID) VALUES (1,1);
INSERT INTO left_to_right (LID, RID) VALUES (1,2);
INSERT INTO left_to_right (LID, RID) VALUES (2,1);
INSERT INTO left_to_right (LID, RID) VALUES (1,4);
INSERT INTO left_to_right (LID, RID) VALUES (4,3);
INSERT INTO left_to_right (LID, RID) VALUES (5,1);
INSERT INTO left_to_right (LID, RID) VALUES (3,5);
INSERT INTO left_to_right (LID, RID) VALUES (4,2);

間違ったクエリ。

SELECT
  DISTINCT left_to_right.LID
  , COUNT(left_to_right.RID) OVER (PARTITION BY left_to_right.LID) AS NUM_RID
  , COUNT(left_to_right.RID) OVER (PARTITION BY
                                      left_to_right.LID
                                  AND
                                      right_data.STATUS = 1
                                  ) AS NUM_RID_S1
FROM
    left_to_right
  JOIN
    right_data
  ON
    right_data.RID = left_to_right.RID
ORDER BY left_to_right.LID;

同じクエリでLID/(すべてのright_data.statusの数)とLID /(right_data.statusの数は1)をカウントするにはどうすればよいですか?

4

2 に答える 2

4

私があなたを正しく理解していれば、これは次のことを行うはずです。

SELECT left_to_right.LID,
       COUNT(DISTINCT left_to_right.RID) all_right_data_statuses,
       COUNT(DISTINCT CASE WHEN right_data.STATUS = 1 THEN left_to_right.RID 
                      ELSE NULL END) right_data_status_1
FROM
    left_to_right
  JOIN
    right_data
  ON
    right_data.RID = left_to_right.RID
GROUP BY left_to_right.LID

これがあなたが試すためのデモです。

于 2013-02-26T16:29:32.563 に答える
1

さて、最も簡単な方法は、right_data.status = 1の行に対してのみこれを行います。したがって、これを試してください。

COUNT(left_to_right.RID) OVER (PARTITION BY left_to_right.LID) AS NUM_RID
COUNT(left_to_right.RID) OVER (PARTITION BY left_to_right.LID, right_data.STATUS) as num2,
(case when right_data.STATUS = 1
      then COUNT(left_to_right.RID) OVER (PARTITION BY left_to_right.LID, right_data.STATUS) /
           COUNT(left_to_right.RID) OVER (PARTITION BY left_to_right.LID)
 end)

これはあなたが必要とするもののために働きますか?

于 2013-02-26T16:30:04.170 に答える