我是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
答案 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