2017-09-12 7 views
0

트랜잭션 데이터 집합 (custid, supplierid, transactionid, date)에서 sql 쿼리를 작성하려고합니다. 나는 최대 거래가 발생한 공급자와 최근 거래가 발생한 공급자를 custID에서 찾고 싶습니다.sql 쿼리 선택 조건

입력

custID - supplierid - transactionid - date 
1  - a   - 1111a   - 9/22/2017 
1  - a   - 1111b   - 9/23/2017 
1  - a   - 1111c   - 9/24/2017 
1  - b   - 1111d   - 9/21/2017 
1  - c   - 1111e   - 9/25/2017 

원하는

custID - suppliermax - supplierrcnt - datercnt 
1  - a   - c   - 9/25/2017 
+0

어떤 DBMS를 사용하고 있습니까? –

+0

특히'date' 필드에 영향을 주므로 사용중인 SQL DB를 지정해야합니다. 예 : PostgreSQL는 원시 타임 스탬프 유형을 지원하지만 SQLite는 일반적으로 타임 스탬프를 문자열 또는 int로 저장합니다. – sirosen

+0

데이터는 netezza에서 호스팅되고 SQuirrel SQL Client를 통해 연결됩니다. 미리 감사드립니다. – user8599523

답변

0

당신이 거래의 최대 수를 더 공급 업체가있는 경우이 쿼리는 더 많은 행을 반환합니다. 또한 항상 하나의 supplierrcnt 공급 업체가 있다고 가정합니다.

SELECT <input_id> AS custid, 
    supplierid AS suppliermax, 
    (
     SELECT supplierid 
     FROM tab 
     WHERE datercnt = (SELECT MAX(datercnt) FROM tab WHERE custID = <input_id>) 
     LIMIT 1 
    ) AS supplierrcnt, 
    (SELECT MAX(datercnt) FROM tab WHERE custID = <input_id>) AS datercnt 
FROM tab 
WHERE custID = <input_id> 
GROUP BY supplierid 
HAVING count(*) >= ALL(
    SELECT COUNT(*) 
    FROM tab 
    WHERE custID = <input_id> 
    GROUP BY supplierid 
) 
+0

샘플에서 cust_id로 집계하기를 원한다고 생각합니다. 샘플은 하나의 고유 한 값만을 제공했습니다. –

+0

@ Error_2646 'cust_id'는 입력 값입니다. 내 솔루션의 집계는 가장 높은 거래 수 (해당 고객의 경우)를 가진 공급자를 찾기 위해 수행됩니다. –

+0

솔루션에서 cust_id가 입력되었음을 알고 있지만 단순한 집계가 아닌 수동 입력 또는 커서가 필요합니다. –

0

나는 Neteeza와 함께 일한 적이 없지만이 같은 분석 기능을 지원한다고 확신합니다.

SELECT cust_id, 
     MAX(
     CASE WHEN suppRN = 1 THEN supplier 
       ELSE NULL 
      END 
     ) AS supplierMax, 
     MAX(
     CASE WHEN tran_rn = 1 THEN supplier 
       ELSE NULL 
      END 
     ) AS supplierrCnt,   
     MAX(
     CASE WHEN tran_rn = 1 THEN date_ 
       ELSE NULL 
      END 
     ) AS datercnt 
    FROM (SELECT cust_id, 
       supplier, 
       date_, 
       ROW_NUMBER() OVER 
       (PARTITION BY cust_id 
         ORDER BY suppCnt DESC 
       ) AS suppRN, 
       tran_rn 
      FROM (SELECT cust_id, 
         supplier, 
         COUNT(*) OVER 
         (PARTITION BY cust_id, 
             supplier 
         ) AS suppCnt, 
         ROW_NUMBER() OVER 
         (PARTITION BY cust_id 
           ORDER BY date_ DESC 
         ) AS tran_rn 
        FROM Customer 
       ) AS TMP 
     ) AS TMP2 
WHERE suppRN = 1 
    OR tran_rn = 1  
GROUP 
    BY cust_id; 
+0

감사합니다. 나는 사용자 정의하고 테스트했으며 작동 중입니다. – user8599523