Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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
Sql server 使用查询或SSI查找SQL数据中的“区域”关系_Sql Server_Relationship_Region - Fatal编程技术网

Sql server 使用查询或SSI查找SQL数据中的“区域”关系

Sql server 使用查询或SSI查找SQL数据中的“区域”关系,sql-server,relationship,region,Sql Server,Relationship,Region,编辑澄清:我每周根据邮政编码编译数据,但有些邮政编码是多余的。我知道如果我能建立关系,我应该能够编译少量数据,并导出冗余的邮政编码 我想通过显示在邮政编码中的一组唯一的项目和值来定义邮政编码的区域,以便创建一个区域表 我希望通过邮政编码找到与某些数据的关系。最后,我有一些表,其中包含许多邮政编码的类似值 我的数据类似于: ItemCode |Value | Zip_Code -----------|-------|------- 1 |10 | 1 2

编辑澄清:我每周根据邮政编码编译数据,但有些邮政编码是多余的。我知道如果我能建立关系,我应该能够编译少量数据,并导出冗余的邮政编码

我想通过显示在邮政编码中的一组唯一的项目和值来定义邮政编码的区域,以便创建一个区域表

我希望通过邮政编码找到与某些数据的关系。最后,我有一些表,其中包含许多邮政编码的类似值

我的数据类似于:

ItemCode   |Value  | Zip_Code
-----------|-------|-------
1          |10     | 1
2          |15     | 1
3          |5      | 1 
1          |10     | 2
2          |15     | 2
3          |5      | 2
1          |10     | 3
2          |10     | 3
3          |15     | 3
或者为了简化这个想法,我甚至可以将ItemCode+值合并为唯一的值:

ItemCode+
Value    | Zip_Code
A        | 1
B        | 1
C        | 1
A        | 2
B        | 2
C        | 2
A        | 3
D        | 3
E        | 3    
如您所见,邮政编码1和2具有相同的不同ItemCode和值。但是,邮政编码3对于某些项目代码具有不同的值

我需要创建一个表,在包含相同数据的邮政编码之间建立关系

最终的表格将类似于:

Zip_Code | Region
1        | 1
2        | 1
3        | 2
4        | 2
5        | 1
6        | 3
...etc
这将允许我只为每个唯一的区域收集一次数据,并适当地导出邮政编码

我现在正在做的事情:

我目前正在使用一个类似于连接的查询,并使用以下内容与邮政编码进行比较:

SELECT a.ItemCode
      ,a.value
      ,a.zip_code
      ,b.ItemCode
      ,b.value
      ,b.zip_code
FROM mytable as a, mytable as b -- select from table twice, similar to a join
WHERE a.zip_code = 1  -- left table will have all ItemCode and Value from zip 1
  AND b.zip_code = 2  -- right table will have all ItemCode and Value from zip 2
  AND a.ItemCode = b.ItemCode -- matches rows on ItemCode 
  AND a.Value != b.Value
ORDER BY ItemCode
如果两个邮政编码具有完全相同的ItemNum和Value,则不会返回任何内容,如果存在差异,则会返回两个邮政编码之间的大量差异

然而,这需要从手动流程转变为自动流程,因为我现在使用的邮政编码超过100个

我没有太多特定语言的编程经验,因此SSIS中的工具对我来说有一定的限制。我有一些使用模糊工具的经验,感觉模糊分组中可能有一些东西可能会照亮明显的区域,但不知道如何设置它

有人有什么建议吗?我可以访问SQLServ及其相关工具和visualstudio。我正试图避免编写一个程序来自动化这一点,因为我的c语言技能相对来说是不成熟的,但如果必要的话,我会解决这个问题

抱歉这么冗长:这是我的第一个问题,这是我同意的一页,为了提出一个问题,建议详细解释,并谈谈我所做的尝试。。。
提前感谢您为我提供的任何帮助。

试一试我使用了简化的示例,但这可以很容易地扩展。我认为这段代码真正有趣的部分是递归CTE

;with matches as (
    --Find all pairs of zip_codes that have matching values.
    select d1.ZipCode zc1, d2.ZipCode zc2
    from data d1
        join data d2 on d1.Val=d2.Val
    group by d1.ZipCode, d2.ZipCode
    having count(*) = (select count(distinct Val) from data where zipcode = d1.Zipcode)
), cte as (
    --Trace each zip_code to it's "smallest" matching zip_code id.
    select zc1 tempRegionID, zc2 ZipCode
    from matches
    where zc1<=zc2
    UNION ALL
    select c.tempRegionID, m.zc2
    from cte c
        join matches m on c.ZipCode=m.zc1
                      and c.ZipCode!=m.zc2
    where m.zc1<=m.zc2
)
--For each zip_code, use it's smallest matching zip_code as it's region.
select zipCode, min(tempRegionID) as regionID
from cte
group by ZipCode

证明所有东西都有用途,尽管通常这会让我畏缩:将每个邮政编码的值连接到一个字段中。将ZipCode和concatenatedvalue存储在一个查找表PK中,另一个存储在UQ中。现在,您可以通过对ConcatenatedValue进行分组来评估哪些邮政编码位于同一地区

下面是一个连接文本数据的简单函数:

CREATE TYPE dbo.List AS TABLE
(
Item    VARCHAR(1000)
)
GO

CREATE FUNCTION dbo.Implode (@List dbo.List READONLY, @Separator VARCHAR(10) = ',') RETURNS VARCHAR(MAX)
AS BEGIN
    DECLARE @Concat VARCHAR(MAX)
    SELECT @Concat = CASE WHEN Item IS NULL THEN @Concat ELSE COALESCE(@Concat + @Separator, '') + Item END FROM @List
    RETURN @Concat
END
GO

DECLARE @List AS dbo.List
INSERT INTO @List (Item) VALUES ('A'), ('B'), ('C'), ('D')
SELECT dbo.Implode(@List, ',')

虽然你在这个问题上做了很多细节,但你在这里试图实现的最终目标仍然相当模糊。是什么定义了一个地区,我们如何知道给定的项目代码和值,或者仅仅知道一个值邮政编码所在的地区?对此表示抱歉。最终,我的目标是分析和整合数据。假设邮政编码1和2具有相同的ItemCode和Value集,则邮政编码1和2可以被视为同一区域。在该数据集中,相同的项目代码具有不同的值是很常见的,不能将其视为同一区域。每个项目代码在每个邮政编码中只显示一次。区域本身是完全任意的,更多的是为了将邮政编码分组在一起。因此,基于这种逻辑,似乎一个邮政编码可以在多个区域中,对吗?因为在这个数据集中,相同的ItemCodes具有不同的值是很常见的,ItemCodes具有不同的值。。。不能被视为同一地区,每个项目代码在每个邮政编码中只出现一次。很抱歉我很难描述这个。。。让我这样试试:目前我收集10个邮政编码的ItemCode和Value。我知道其中实际上只包含2-3组唯一的ItemCode和Value,但我不知道这种关系发生在哪个邮政编码中。我更愿意只收集这2-3个独特的集合,每个区域一组数据——并从最后的表中导出邮政编码。数据会定期更新,为每个邮政编码创建数据是一项艰巨的任务。我想你刚才说的话让我明白了——你想通过邮政编码中出现的一组独特的项目和值来定义一个邮政编码的区域。我将尝试根据这个假设制定一个解决方案。感谢您抽出时间来研究我的问题。我的无偏见妨碍了我将其扩展到实际的数据集,但它确实帮助我对数据的思考有所不同。我感谢你的意见!我可不是什么ereeto bambito的代码发布者, 所以我很感激这里的人们给我的建议。当我通读和测试各个阶段时,这个例子尤其令人鼓舞。我觉得它很聪明,帮助我学习。我能够成功地将其集成到更大的测试数据集中——下一步是在32000条记录(32个邮政编码:D)的主数据集上进行尝试。感谢您与我和大家分享您的sql知识。