SQL Query 根据过滤器将数据传输到另一个表

Posted

技术标签:

【中文标题】SQL Query 根据过滤器将数据传输到另一个表【英文标题】:SQL Query to transfer the data to another table based on filter 【发布时间】:2020-09-11 20:05:33 【问题描述】:

目前我的表格中的数据如下所示:

#Tbl_A

Id  Customer_Id     Indicator
1   912538132       1  
2   912538132       2
3   912538132       3
4   912538132       1
5   912538132       1
6   912538132       2
7   912538132       1
8   912538132       2
9   912538132       3
10  912538132       4   

这里我需要通过应用过滤器将上述#Tbl_A 数据传输到#Tbl_B 表:指标应大于或等于3。

EXAMPLE-DATA 将数据加载到#Tbl_B

#Tbl_B

Id  Customer_Id     Indicator
1   912538132       1  
2   912538132       2
3   912538132       3

7   912538132       1
8   912538132       2
9   912538132       3
10  912538132       4

注意:其余数据不应插入#Tbl_B..因为指标序列不大于或等于3。

我尝试过使用BETWEENIN 运算符。但我在#Tbl_B 中得到了意想不到的结果。

【问题讨论】:

请向我们展示您的尝试。 【参考方案1】:

这是一个间隙和孤岛问题,您需要在其中构建指标按顺序排列的相邻记录组。然后,您要过滤掉不包含指标 3 的组。

如果id 总是以1 递增而没有间隙,那么我们可以使用其值与增量之间的差来构建组:

insert into #tableb (id, customer_id, indicator)
select id, customer_id, indicator
from (
    select 
        a.*, 
        max(case when indicator = 3 then 1 else 0 end)
            over(partition by customer_id, id - indicator) has_3
    from #tablea a
) a
where has_3 = 1

否则,您可以使用row_number() 生成另一个id

insert into #tableb (id, customer_id, indicator)
select id, customer_id, indicator
from (
    select 
        a.*, 
        max(case when indicator = 3 then 1 else 0 end)
            over(partition by customer_id, new_id - indicator) has_3
    from (
        select 
            a.*, 
            row_number() over(partition by customer_id order by id) new_id
        from #tablea a
    ) a
) a
where has_3 = 1

【讨论】:

【参考方案2】:

这似乎对我有用...

    DROP TABLE IF EXISTS #tableA, #tableB;
CREATE TABLE #tableA  (id INT, customer_id INT, indicator INT) ;
CREATE TABLE #tableB  (id INT, customer_id INT, indicator INT) ;
INSERT INTO #tableA
(
    id
  , customer_id
  , indicator
)
VALUES
(1  ,912538132, 1)
,(2 ,912538132, 2)
,(3 ,912538132, 3)
,(4 ,912538132, 1)
,(5 ,912538132, 1)
,(6 ,912538132, 2)
,(7 ,912538132, 1)
,(8 ,912538132, 2)
,(9 ,912538132, 3)
,(10    ,912538132, 4);



INSERT INTO #tableB
(
    id
  , customer_id
  , indicator
)
SELECT id, customer_id, indicator FROM #tableA WHERE indicator >=3


SELECT * FROM #tableB;

我得到了 ID 3、9 和 10。这就是你要找的东西,对吧?

【讨论】:

以上是关于SQL Query 根据过滤器将数据传输到另一个表的主要内容,如果未能解决你的问题,请参考以下文章

根据唯一记录 postgres 将一列从一个 sql 表传输到另一列

mysql中sql语句查询的同时根据条件将数据插入到另一个表的做法?

sql将一个表中的某一列数据更新到另一个表中

SQL Big Query 完全连接表以使用相同的过滤器

sql的存储过程实例--动态根据表数据复制一个表的数据到另一个表

将一个表中的值链接到另一个表,并根据 sql 中另一个表中的列对一个表进行切片