Tsql SQL:基于不匹配数据的相对序列关联行

Tsql SQL:基于不匹配数据的相对序列关联行,tsql,Tsql,所以我相信这可能是一个重复的问题,但我还没有找到正确的帖子和答案。正在寻找在T-SQL中工作的解决方案 我试图解决的问题是用松散耦合的数据关联两个表。例如: CREATE TABLE things1 ( id INT NOT NULL, parentgroup CHAR(1), datecreated DATETIME NOT NULL) GO INSERT INTO things1 SELECT 1, 'A', '2018-10-01 01:00:00.000' UNION AL

所以我相信这可能是一个重复的问题,但我还没有找到正确的帖子和答案。正在寻找在T-SQL中工作的解决方案

我试图解决的问题是用松散耦合的数据关联两个表。例如:

CREATE TABLE things1 (
  id INT NOT NULL,
  parentgroup CHAR(1),
  datecreated DATETIME NOT NULL)
GO

INSERT INTO things1
SELECT 1, 'A', '2018-10-01 01:00:00.000'
UNION ALL
SELECT 2, 'A' '2018-10-01 01:00:02.000'
UNION ALL
SELECT 3, 'A', '2018-10-01 01:00:02.345'
UNION ALL
SELECT 4, 'B', '2018-10-01 01:00:01.000'
UNION ALL
SELECT 5, 'B', '2018-10-01 01:00:03.000'
GO

CREATE TABLE things2 (
  id INT NOT NULL,
  parentgroup CHAR(1),
  datecreated DATETIME NOT NULL)
GO

INSERT INTO things2
SELECT 1, 'A', '2018-10-01 01:04:00.000'
UNION ALL
SELECT 2, 'A' '2018-10-01 01:05:12.000'
UNION ALL
SELECT 3, 'A', '2018-10-01 01:05:02.345'
UNION ALL
SELECT 4, 'A', '2018-10-01 01:06:01.000'
UNION ALL
SELECT 5, 'A', '2018-10-01 01:07:03.000'
UNION ALL
SELECT 6, 'B', '2018-10-01 01:04:08.000'
GO
我想填充的是:

CREATE TABLE things1xthings2 (thing1id INT, thing2id INT)
GO
这两个表中的行需要如何耦合的规则是对给定父组的datecreated值进行排序(因此本文的标题)。根据上面的示例数据,规则的结果如下:

thing1id    thing2id
--------    --------
1           1        (matching lowest datecreated for group A)
2           3        (matching next lowest)
3           2        (matching next lowest)
4           6        (matching lowest datecreated for group B)
要点:两个表中的给定组可能有更多行。“临时演员”在交叉桌上没有一个搭档或一排人

我不知道有什么方法可以在一个基于集合的联接操作中实现这一点,但是如果有一种方法可以做到这一点,我很乐意看到它

我的方法是在每个表中添加一列:

ALTER TABLE things1 ADD sequence INT
GO

ALTER TABLE things2 ADD sequence INT 
GO
此列实质上将datecreated值转换为枚举序列,然后在基于集合的联接操作中匹配该序列,以填充交叉表:

INSERT INTO things1xthings2
SELECT t1.id, t2.id
FROM things1 t1 
JOIN things2 t2 ON t2.parentgroup = t1.parentgroup
  AND t2.sequence = t1.sequence
问题是我也不知道如何构建序列列的值。我只知道当我完成时,数据会是这样的:

SELECT * FROM things1
id parentgroup datecreated             sequence
-- ----------- -----------             --------
1  A           2018-10-01 01:00:00.000 1
2  A           2018-10-01 01:00:02.000 2
3  A           2018-10-01 01:00:02.345 3
4  B           2018-10-01 01:00:01.000 1
5  B           2018-10-01 01:00:03.000 2

SELECT * FROM things2
id parentgroup datecreated             sequence
-- ----------- -----------             --------
1  A           2018-10-01 01:04:00.000 1
2  A           2018-10-01 01:05:02.345 2
3  A           2018-10-01 01:05:12.000 3
4  A           2018-10-01 01:06:01.000 4
5  A           2018-10-01 01:07:03.000 5
6  B           2018-10-01 01:04:08.000 1
谢谢你的帮助


(编辑:我的“f”和“d”键卡住了!)

非常感谢user@Shnugo为我指明了正确的方向。在OVER子句中使用带有分区BY和ORDER BY的ROW_NUMBER(),我能够在单个集合操作中创建所需的关联,如下所示:

SELECT a.id, b.id
FROM (
    SELECT id, parentgroup, datecreated, 
        ROW_NUMBER() OVER(
            PARTITION BY parentgroup 
            ORDER BY datecreated) AS seq
    FROM things1) a
JOIN (
    SELECT id, parentgroup, datecreated, 
        ROW_NUMBER() OVER(
            PARTITION BY parentgroup 
            ORDER BY datecreated) AS seq
    FROM things2) b ON b.parentgroup = a.parentgroup 
AND b.seq = a.seq
当对上面的示例数据运行时,它会精确地生成所需的关联:

1<->1
2<->3
3<->2
4<->6
11
23
32
46

只需添加一个简单的INSERT,表就会完全按照需要填充。

您使用的是什么数据库?这是一个非常复杂的问题+从我这边。您可能会在
OVER()
-子句中阅读到带有
分区依据和
顺序依据的
行编号()。这允许使用(分区)编号的序列…@GGadde这是用于SQL Server 2012的anks@Shnugo!我怀疑这可能是解决方案的一部分。我会仔细看看你建议的条款,看看我能不能做点什么。太好了,编码快乐!