做我想做的事情的更好方法是什么?

时间:2018-05-31 13:56:44

标签: sql google-cloud-platform

我是SQL的新手,我需要一些帮助。我需要按降序对某些列进行排序,只获取顶部列。我主要担心的是SELECT *,我认为这可能导致性能问题。另一个问题是,这种方法留下了一个无关的ROW_NUMBER列,我最终不需要,但除非我包含该列,否则我的SQL无效。

INSERT INTO
  FNL_PROF_BID_ID_W2 ( 
    CUST_ORD_NBR,
    STR_LOC_ID,
    PROF_BID_ID,
    ROW_NUMBER )
SELECT
  *
FROM (
  SELECT
    PB.CUST_ORD_NBR,
    PB.LOC_NBR,
    PB.PROF_BID_ID AS PROF_BID_ID,
    ROW_NUMBER() OVER(PARTITION BY PB.CUST_ORD_NBR, PB.LOC_NBR ORDER BY PB.PROF_BID_ID DESC, PB.CRT_TS DESC) AS ROW_NUMBER
  FROM
    PROF_BID PB )
WHERE
  ROW_NUMBER = 1

2 个答案:

答案 0 :(得分:1)

ROW_NUMBER()是解决此问题的好方法。在某些情况下,您可以使用以下方式获得更好的性能:

INSERT INTO FNL_PROF_BID_ID_W2 (CUST_ORD_NBR, STR_LOC_ID, PROF_BID_ID)
    SELECT PB.CUST_ORD_NBR, PB.LOC_NBR, PB.PROF_BID_ID
    FROM PROF_BID PB
    WHERE PB.PROF_BID_ID = (SELECT MAX(PB2.PROF_BID_ID)
                            FROM PROF_BID PB
                            WHERE PB2.CUST_ORD_NBR = PB.CUST_ORD_NBR AND PB2.LOC_NBR = PB.LOC_NUMBER
                          );

这假设PROF_BID_ID是唯一的,这意味着您不需要第二个键来唯一标识一行(根据命名约定,这似乎是合理的)。

特别是,这可以最大限度地利用(CUST_ORD_NBR, LOC_NUMBER, PROF_BID_ID)上的索引。

但是,我应该强调,为此目的使用ROW_NUMBER()没有任何问题。

也可以这样做:

INSERT INTO FNL_PROF_BID_ID_W2 (CUST_ORD_NBR, STR_LOC_ID, PROF_BID_ID)
    SELECT PB.CUST_ORD_NBR, PB.LOC_NBR, MAX(PB.PROF_BID_ID)
    FROM PROF_BID PB
    GROUP BY PB.CUST_ORD_NBR, PB.LOC_NBR;

答案 1 :(得分:0)

更改FNL_PROF_BID_ID_W2定义以排除row_number

INSERT INTO
  FNL_PROF_BID_ID_W2 ( 
    CUST_ORD_NBR,
    STR_LOC_ID,
    PROF_BID_ID )
SELECT
  CUST_ORD_NBR,
    STR_LOC_ID,
    PROF_BID_ID
FROM (
  SELECT
    PB.CUST_ORD_NBR,
    PB.LOC_NBR,
    PB.PROF_BID_ID AS PROF_BID_ID,
    ROW_NUMBER() OVER(PARTITION BY PB.CUST_ORD_NBR, PB.LOC_NBR ORDER BY PB.PROF_BID_ID DESC, PB.CRT_TS DESC) AS ROW_NUMBER
  FROM
    PROF_BID PB )
WHERE
  ROW_NUMBER = 1