我使用
从表“DIBBS.nsn”中制作了一个表“winner”SELECT *
INTO "winner"
FROM
(SELECT
nsn_part_number,
reason,
ROW_NUMBER() OVER(PARTITION BY nsn_part_number ORDER BY date_accessed DESC) rn
FROM
DIBBS_nsn
WHERE
order_status = 'WON') a
WHERE rn = 1
这需要所有“
nsn_part_number
”以及任何“WON”状态的原因。对于重复项,它需要最新日期的零件号和原因。
我正在尝试找出如何使用
DIBBS_nsn
来更新此表。 DIBBS_nsn
每天都会添加新行。
我尝试过的:
MERGE INTO winner AS target
USING dibbs_nsn AS source ON (target.nsn_part_number = source.nsn_part_number)
AND (source.order_status = 'WON')
WHEN NOT MATCHED
THEN INSERT (nsn_part_number, reason)
VALUES (source.nsn_part_number, source.reason)
此插入不会过滤掉任何重复项,这是有道理的,但不知道如何将其放入。
目前我的解决方法是删除表格并重新制作表格,然后使用更新来更新“获胜者”
DIBBS_nsn
。
我相信有一个查询需要更新,也许是更新插入?我调查了它,但有点困惑,因为我的选择只采用最新日期的零件号。
我需要什么:我可以运行的查询,每天在任务管理器中使用,在新行添加到
DIBBS_nsn
后更新“获胜者”表。
不鼓励在 SQL 中使用
SELECT INTO
。请使用 CREATE TABLE AS
来代替。
CREATE TABLE winner AS -- !
SELECT DISTINCT ON (nsn_part_number) -- !
nsn_part_number, reason
FROM dibbs_nsn
WHERE order_status = 'WON'
ORDER BY nsn_part_number, date_accessed DESC; -- !
参见:
表中没有包含多余的
rn
。ALTER TABLE winner ADD PRIMARY KEY (nsn_part_number); -- !
您的每日(?)更新可以作为UPSERT:
INSERT INTO winner (nsn_part_number, reason)
SELECT DISTINCT ON (nsn_part_number)
nsn_part_number, reason
FROM dibbs_nsn
WHERE order_status = 'WON'
ORDER BY nsn_part_number, date_accessed DESC
ON CONFLICT (nsn_part_number) DO UPDATE -- !
SET reason = excluded.reason; -- !
这对于每个
nsn_part_number
的几个合格行来说效果很好。对于很多人来说,其他查询技术要快得多。取决于未公开的信息。
参见: