2

(そのアカウントの)前のエントリと比較して、テーブルからレコードを取得したかったのです。以下の表とデータをご覧ください。

このアウトプットで私が欲しかったのは、

ID_NUM  DELIVERY_TYPE
100     2                
101     2
102     2

説明: DELIVERY_TYPE IS 2 (古いレコードは 1) での最初の出現であるため 100 が必要 DELIVERY_TYPE IS 2 (古いレコードは 3) での最初の出現であるため 101 この ID_NUM のエントリは 1 つしかないため、102 が必要です。配送タイプは 2 です

I DON'T NEED 103 DELIVERY_TYPE IS 1 最近の DELIVERY_TYPE IS 1 でも DELIVERY_TYPE IS 2 104 DELIVERY_TYPE IS 2 のレコードが 2 つ以上あるため

この結果を達成する方法を知っている体はありますか?

CREATE TABLE DEMO
  (
    ID_NUM         NUMBER(10,0),
    DELIVERY_TYPE  NUMBER(2,0),
    NAME           VARCHAR2(100),
    CREATED_DATE   DATE
  );


INSERT INTO DEMO
  (ID_NUM, DELIVERY_TYPE, CREATED_DATE)
VALUES
  (100, 2, TO_DATE('10-FEB-12 11:08:49 AM', 'DD-MON-RR HH:MI:SS AM'));
INSERT INTO DEMO
  (ID_NUM, DELIVERY_TYPE, CREATED_DATE)
VALUES
  (100, 1, TO_DATE('29-JAN-12 11:09:00 AM', 'DD-MON-RR HH:MI:SS AM'));

INSERT INTO DEMO
  (ID_NUM, DELIVERY_TYPE, CREATED_DATE)
VALUES
  (101, 2, TO_DATE('09-FEB-12 11:09:26 AM', 'DD-MON-RR HH:MI:SS AM'));
INSERT INTO DEMO
  (ID_NUM, DELIVERY_TYPE, CREATED_DATE)
VALUES
  (101, 3, TO_DATE('14-JAN-12 11:09:33 AM', 'DD-MON-RR HH:MI:SS AM'));

INSERT INTO DEMO
  (ID_NUM, DELIVERY_TYPE, CREATED_DATE)
VALUES
  (102, 2, TO_DATE('02-FEB-12 10:09:26 AM', 'DD-MON-RR HH:MI:SS AM'));

INSERT INTO DEMO
  (ID_NUM, DELIVERY_TYPE, CREATED_DATE)
VALUES
  (103, 1, TO_DATE('01-FEB-12 10:09:26 AM', 'DD-MON-RR HH:MI:SS AM'));
INSERT INTO DEMO
  (ID_NUM, DELIVERY_TYPE, CREATED_DATE)
VALUES
  (103, 2, TO_DATE('02-JAN-12 11:09:33 AM', 'DD-MON-RR HH:MI:SS AM'));

INSERT INTO DEMO
  (ID_NUM, DELIVERY_TYPE, CREATED_DATE)
VALUES
  (104, 2, TO_DATE('02-FEB-12 10:09:26 AM', 'DD-MON-RR HH:MI:SS AM'));
INSERT INTO DEMO
  (ID_NUM, DELIVERY_TYPE, CREATED_DATE)
VALUES
  (104, 2, TO_DATE('02-FEB-12 10:09:26 AM', 'DD-MON-RR HH:MI:SS AM'));
4

4 に答える 4

2

LAG関数を使用します。

挿入ステートメントの代わりに (/に加えて)、例の小さな値の表を投稿すると簡単になる場合があります。

于 2012-02-14T23:19:32.277 に答える
1

id_num次のクエリは、最後delivery_typeが2で、値2がdelivery_type1回だけ出現したレコードを1つずつ返します。

SELECT DISTINCT id_num, last_delivery_type
FROM   (SELECT id_num,
               FIRST_VALUE(delivery_type) 
                  OVER (PARTITION BY id_num 
                        ORDER BY created_date DESC) 
                  AS last_delivery_type,
               COUNT(CASE WHEN delivery_type = 2 
                          THEN 2 ELSE NULL END) 
                  OVER (PARTITION BY id_num) AS delivery_type_2_cnt
        FROM   demo)
WHERE  last_delivery_type = 2 AND delivery_type_2_cnt = 1
于 2012-02-15T16:16:17.300 に答える
1

ROW_NUMBER()関数を使用して、ID_NUMでパーティション化し、CREATED_DATEの降順で並べ替えることにより、最新の行を分離できます。次に、複数のDELIVERY_TYPE = 2のオカレンスを特定して、結果セットをフィルタリングします。

SELECT ID_NUM, DELIVERY_TYPE
FROM (SELECT ID_NUM, DELIVERY_TYPE,
             ROW_NUMBER() OVER (PARTITION BY ID_NUM
                                ORDER BY CREATED_DATE DESC) AS RN
      FROM DEMO)
WHERE RN = 1
AND DELIVERY_TYPE = 2
MINUS
SELECT ID_NUM, DELIVERY_TYPE
FROM (SELECT ID_NUM, DELIVERY_TYPE, COUNT(*) AS REC_COUNT
      FROM DEMO
      WHERE DELIVERY_TYPE = 2
      GROUP BY ID_NUM, DELIVERY_TYPE
      HAVING COUNT(*) > 1)

これにより、期待される結果が返されます。

于 2012-02-15T02:33:53.583 に答える
1

このクエリは、指定された入力に対して目的の出力を提供しますが、ルールを完全には理解していません。

  select ID_NUM, DELIVERY_TYPE
    from (  select ID_NUM, DELIVERY_TYPE, CREATED_DATE
              from DEMO
          group by ID_NUM, DELIVERY_TYPE, CREATED_DATE
            having count(*) = 1) CNT1
   where CREATED_DATE = (select max(CREATED_DATE)
                           from DEMO D
                          where D.ID_NUM = CNT1.ID_NUM)
         and DELIVERY_TYPE <> 1
order by ID_NUM, DELIVERY_TYPE, CREATED_DATE  

ID_NUMたとえば、 an のエントリが 1 つだけで、= 1 でない場合に何が起こるかを拡張すると、DELIVERY_TYPEおそらく更新できます。

于 2012-02-14T23:32:58.010 に答える