代码之家  ›  专栏  ›  技术社区  ›  artemis Roberto

选择供应商的第一个实例,零件组合

  •  0
  • artemis Roberto  · 技术社区  · 4 年前

    我正在尝试创建一个指标,以确定特定交易是否是 第一次 从某个特定的供应商那里购买了一个零件。

    我有一个数据集,看起来像这样:

    | transaction_id | vendor_id | part_id |     trans_date    |
    |:--------------:|:---------:|:-------:|:-----------------:|
    |    9Bx*2Pc'    |     a     |   873   |     10/12/2018    |
    |    1Po.4Ot,    |     a     |   473   |     4/22/2016     |
    |    9Sk"7Kv/    |     b     |   123   |     7/23/2016     |
    |    2Lz&7Hu&    |     a     |   873   |     12/20/2017    |
    |    8Lz)5Is#    |     b     |   743   |     10/22/2016    |
    |    5Sc'6Jl/    |     a     |   113   |     10/6/2016     |
    |    0Ra&8Hb&    |     a     |   653   |     10/4/2017     |
    |    4Wc-8Of*    |     c     |   333   |      8/3/2017     |
    |    8Vv+9Yo/    |     c     |   333   |     12/7/2016     |
    |    6Qh!1Ha-    |     c     |   333   |     3/28/2017     |
    |    2Ol%4Rs#    |     c     |   333   |      5/2/2017     |
    |    1Gg#8Cm%    |     c     |   333   |     11/15/2016    |
    |    0Lw(6Pv/    |     d     |   873   |     8/13/2017     |
    |    1Gy/7Zw,    |     a     |   443   |     10/12/2018    |
    |    2Gz,4Gp.    |     b     |   103   |      1/5/2018     |
    |    5Dj)6Wc+    |     a     |   893   |     12/17/2016    |
    |    5Hl-8Ds!    |     a     |   903   |     12/8/2017     |
    |    8Ws$3Vy*    |     b     |   873   |     1/13/2018     |
    

    我想做的是确定 transaction_id 那是 第一次 (按排序 trans_date ),那 part_id 购自a vendor_id 。我想理想的输出应该是这样的:

    | transaction_id | vendor_id | part_id |     trans_date    | first_time |
    |:--------------:|:---------:|:-------:|:-----------------:|:----------:|
    |    9Bx*2Pc'    |     a     |   873   |     10/12/2018    |      N     |
    |    1Po.4Ot,    |     a     |   473   |     4/22/2016     |      Y     |
    |    9Sk"7Kv/    |     b     |   123   |     7/23/2016     |      Y     |
    |    2Lz&7Hu&    |     a     |   873   |     12/20/2017    |      Y     |
    |    8Lz)5Is#    |     b     |   743   |     10/22/2016    |      Y     |
    |    5Sc'6Jl/    |     a     |   113   |     10/6/2016     |      Y     |
    |    0Ra&8Hb&    |     a     |   653   |     10/4/2017     |      Y     |
    |    4Wc-8Of*    |     c     |   333   |      8/3/2017     |      N     |
    |    8Vv+9Yo/    |     c     |   333   |     12/7/2016     |      N     |
    |    6Qh!1Ha-    |     c     |   333   |     3/28/2017     |      N     |
    |    2Ol%4Rs#    |     c     |   333   |      5/2/2017     |      N     |
    |    1Gg#8Cm%    |     c     |   333   |     11/15/2016    |      Y     |
    |    0Lw(6Pv/    |     d     |   873   |     8/13/2017     |      Y     |
    |    1Gy/7Zw,    |     a     |   443   |     10/12/2018    |      Y     |
    |    2Gz,4Gp.    |     b     |   103   |      1/5/2018     |      Y     |
    |    5Dj)6Wc+    |     a     |   893   |     12/17/2016    |      Y     |
    |    5Hl-8Ds!    |     a     |   903   |     12/8/2017     |      Y     |
    |    8Ws$3Vy*    |     b     |   873   |     1/13/2018     |      Y     |
    

    到目前为止,我已经尝试过(这受到了 this post ):

    WITH
      first_instance AS (
        SELECT
          tbl_trans.*,
          ROW_NUMBER() OVER (PARTITION BY vendor_id||part_id ORDER BY trans_date) AS row_nums
        FROM
          tbl_trans
     )
     
     SELECT
       x.*,
       CASE WHEN y.row_nums = 1 THEN 'Y' ELSE 'N' END AS first_time_indicator
     FROM
       tbl_trans x
         LEFT JOIN first_instance y
    

    但我遇到了:

    ORA-00905: missing keyword

    到目前为止,我已经用这些数据和查询创建了一个SQL FIDDLE进行测试。 我如何确定交易是否是零件/供应商组合的首次购买?

    0 回复  |  直到 4 年前
        1
  •  1
  •   Gordon Linoff    4 年前

    使用窗口功能:

    select t.*,
           (case when row_number() over (partition by vendor_id, part_id order by trans_date) = 1
                 then 'Y' else 'N'
            end) as first_time
    from tbl_trans t;
    

    你不需要 join .

        2
  •  0
  •   Popeye    4 年前

    除了 row_number ,有多种方法可以使用如下分析函数来实现所需的结果。

    您可以使用 first_value 分析函数如下:

    Select t.*,
           Case 
             when first_value(trans_date) 
                    over (partition by vendor_id, part_id order by trans_date) = trans_date
             then 'Y' 
             else 'N' 
           end as first_time
    From your_table t;
    

    同样,您也可以使用 min 如下:

    Select t.*,
           Case 
             when min(trans_date) 
                    over (partition by vendor_id, part_id) = trans_date
             then 'Y' 
             else 'N' 
           end as first_time
    From your_table t;