2

抱歉标题不好-我根本不知道该怎么称呼我想做的事情。

它是这样的:

在 MS SQL Server 2008 中

我有一个使用 WITH 语句创建的包含 4000 多行的临时表,如下所示:

ID (varchar) 日期 (int)

AB1135000097 | 20151221
AB1135000097 | 20160119
AB1135000097 | 20160219
AB1135001989 | 20120223
AB1135001989 | 20120323
AB1135001989 | 20120423

.
.

我想根据 DATE 对日期范围内的数据进行配对。

AB1135000097 | 20151221 | 20160119
AB1135000097 | 20160119 | 20160219
AB1135001989 | 20120223 | 20120323
AB1135001989 | 20120323 | 20120423

这个动作有名字吗?(当我知道我在问什么时,我会在帖子中添加标签)

4

3 回答 3

4

假定架构

我假设你的桌子是这样的:

CREATE TABLE "TABLE"
(
    tag     CHAR(1) NOT NULL,
    value   INTEGER NOT NULL,
    PRIMARY KEY(tag, value)
);

不过,我真的不必猜测架构。

可能的答案

从表面上看,您可能会追求:

SELECT t1.tag, t1.value, t2.value
  FROM "TABLE" AS t1
  JOIN "TABLE" AS t2
    ON t1.tag = t2.tag AND t2.value = t1.value + 1
 ORDER BY t1.tag, t1.value;

这会将表与自身连接起来,组合tag列值(AB、 ...)相同的行,并且其中value一行中的列比另一行中的列多一value

另一方面,如果您('A', 5)向表中添加一行并期望它作为一行的一部分出现在输出中('A', 3, 5),那么如果不使用 OLAP 功能,查询将更难编写。

于 2012-07-03T13:16:39.107 回答
1

如果您使用的是 Oracle 数据库,那么您可以参考以下查询来解决这个问题 -

with t as
(
SELECT 'A' Col1, 1 Col2
  FROM Dual
UNION ALL
SELECT 'A' Col1, 2 Col2
  FROM Dual
UNION ALL
SELECT 'A' Col1, 3 Col2
  FROM Dual
UNION ALL
SELECT 'B' Col1, 4 Col2
  FROM Dual
UNION ALL
SELECT 'B' Col1, 5 Col2
  FROM Dual
UNION ALL
SELECT 'B' Col1, 6 Col2 FROM Dual
)
SELECT *
  FROM (SELECT Col1,
               Col2,
               Lead(Col1) Over(ORDER BY Col1, Col2) Col3,
               Lead(Col2) Over(ORDER BY Col1, Col2) Col4
          FROM t  --(your table name)
         ORDER BY Col1, Col2)
 WHERE Col1 = Col3

因为我没有您的表名和表结构,所以我在 Query 本身中创建了一个临时表。

您需要更改 From tFrom您的表名。..请相应地更改 col1 和 col2 列名。

于 2012-07-03T13:19:11.163 回答
1

我找到了解决我的问题的方法。灵感来自 Jonathan Leffler 的解决方案。非常感谢!

它基于将行号添加到按 ID 和 DATE 排序的表中,然后与 ROW+1 自连接以获得下一个日期作为第二个日期列。

with 
SCHEDULE as
( -- remove duplicates and NULL entries

    select DISTINCT ID, DATE from TABLE1
    where DATE IS NOT NULL
),

SCHEDULE_WITH_ROW as
(
select * from (
    select DISTINCT ROW_NUMBER()
        OVER (ORDER BY ID, DATE) AS
        ROW, ID, DATE 
    from SCHEDULE) AS SCHED
)

select 
    S1.ID
    , S1.DATE
    , S2.DATE
from SCHEDULE_WITH_ROW S1
    join SCHEDULE_WITH_ROW S2 on S2.ID = S1.ID and S1.ROW + 1 = S2.ROW 
于 2012-07-04T12:44:24.363 回答