Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql:延迟到找到具有特定值的行,然后返回该值_Sql_Postgresql - Fatal编程技术网

Postgresql:延迟到找到具有特定值的行,然后返回该值

Postgresql:延迟到找到具有特定值的行,然后返回该值,sql,postgresql,Sql,Postgresql,我有一个包含客户电子邮件的数据集 其中一列是Type。在Type中存在一个值“Duplicate Case”,该值表示客户刚刚向我们发送了大量关于同一主题的电子邮件。我们只回复原件,并将所有其他案件作为副本结案。但我想做的是,获取原始电子邮件的类型 我希望能够创建列原始类型: 每个客户通常不会有超过5个重复的案例。我想添加逻辑,它只返回重复案例比原始案例早24小时的结果 我有一段可怕的代码: CASE WHEN type = 'Duplicate Case' AND LAG(type,4)

我有一个包含客户电子邮件的数据集

其中一列是Type。在Type中存在一个值“Duplicate Case”,该值表示客户刚刚向我们发送了大量关于同一主题的电子邮件。我们只回复原件,并将所有其他案件作为副本结案。但我想做的是,获取原始电子邮件的类型

我希望能够创建列原始类型:

每个客户通常不会有超过5个重复的案例。我想添加逻辑,它只返回重复案例比原始案例早24小时的结果

我有一段可怕的代码:

CASE
 WHEN type = 'Duplicate Case'
 AND LAG(type,4) OVER (PARTITION BY c.client_code ORDER BY case_number ASC) = 'Duplicate Case'
  THEN LAG(type,5) OVER (PARTITION BY c.client_code ORDER BY case_number ASC)

 WHEN type = 'Duplicate Case'
 AND LAG(type,3) OVER (PARTITION BY c.client_code ORDER BY case_number ASC) = 'Duplicate Case'
  THEN LAG(type,4) OVER (PARTITION BY c.client_code ORDER BY case_number ASC)

 WHEN type = 'Duplicate Case'
 AND LAG(type,2) OVER (PARTITION BY c.client_code ORDER BY case_number ASC) = 'Duplicate Case'
  THEN LAG(type,3) OVER (PARTITION BY c.client_code ORDER BY case_number ASC)

WHEN LAG(type) OVER (PARTITION BY c.client_code ORDER BY case_number ASC) = 'Duplicate Case'
AND type = 'Duplicate Case'
  THEN LAG(type,2) OVER (PARTITION BY c.client_code ORDER BY case_number ASC)

WHEN type = 'Duplicate Case'
  THEN LAG(type) OVER (PARTITION BY c.client_code ORDER BY case_number ASC)
    END AS original_type
这给了我我想要的东西:


但是我怎样才能添加时间逻辑呢?如果此副本是在原始类型创建前不到24小时创建的,则我只想从第一个非副本中输入类型?

因此,您需要在此处创建一个带有空白字段的临时表,然后使用一些条件更新此空白字段:

/* Main table */

DROP TABLE IF EXISTS cases;
CREATE TEMPORARY TABLE cases AS
SELECT
created_date,
type,
CASE WHEN type = 'Duplicate Case'
  THEN CAST('Unknown' AS VARCHAR(40))
  ELSE type END AS original_type,
 CAST('' AS VARCHAR(40)) AS original_case_number,
client_code,
case_number
FROM case
 ORDER BY c.client_code DESC, case_number DESC;

/* Append previous case data */

UPDATE cases
SET original_case_number = prev_case_number
FROM
(
    SELECT
      a.case_number,
      MAX(b.case_number) AS prev_case_number
      FROM cases a
     LEFT JOIN cases b ON a.client_code = b.client_code
     AND b.created_date BETWEEN a.created_date - INTERVAL '48 hour' AND 
     a.created_date + INTERVAL '1 second'
     AND b.type <> 'Duplicate Case'
     AND a.type = 'Duplicate Case'
     GROUP BY 1
 ) prev
  WHERE cases.case_number = prev.case_number;

UPDATE cases
SET original_type = b.type
FROM (SELECT *
      FROM cases) b
  WHERE cases.original_case_number = b.case_number;

从案例中选择*

我认为您不需要延迟。您可以创建一个临时表,用ID隔离每个唯一的案例。我想逻辑应该是按照GROUP BY on Created Date、Customer ID和Type,其中Type“Duplicated case”。然后用你的时间逻辑将这个表连接到新创建的ID上的原始ID。哦,你的ID逻辑已经在分区中了,所以为每个分区创建一个唯一的ID。我同意ruaridh的观点,他的方法更干净,。但是如果你坚持使用滞后,看看这个答案。不要使用array_agg并相应地熟练地将组包括在日期中我理解你们的意思,我相信你们是对的,因为我不需要为固定数量的重复记录编写代码。我所做的是使用列原始类型创建一个临时表,然后运行一个查询,用客户最新的非重复案例类型更新此列,其中类型为“重复”。我会用答案更新这篇文章