2

如果某些触发解决方案已经涵盖了这一点,但我无法让它们适用于我的场景,请提前道歉。

我有一个超过 50,000 行的表,所有行都有一个ID,大约有 5000 个不同的 ID 值。表中可能有 100 行instrumentID = 1和 50行,instrumentID = 2但它们的列条目会略有不同。所以我可以写一个

SELECT * from tbl WHERE instrumentID = 1 

并让它返回 100 行(我知道这很简单,但要清楚)

我需要做的是在每次找到仪器 ID 时形成一个递增值,所以我尝试了这样的东西:

    IntIndex INT IDENTITY(1,1), 
    dDateStart DATE,
    IntInstrumentID INT,
    IntIndex1 AS IntInstrumentID + IntIndex,

在表创建步骤。

但是,无论在表中的何处找到记录,我都需要在找到IntIndex1an 时递增instrumentID,以便仅通过查看最后一个IntIndex1值就可以有效地提供记录计数。而不是上面所做的,它会在表的所有行上递增,而不管instrumentID你会得到 5001,4002,4003 等。

例如:对于 intInstruments 5000 和 4000

intInstrumentID  | IntIndex1
--------- ------------------
    5000         |   5001
    5000         |   5002
    4000         |   4001
    5000         |   5003
    4000         |   4002

我需要这样做的原因是因为我需要根据这些值加入两个表(每个表的开始和结束日期instrumentID)。我已经尝试过GROUP BY等,但这在两个表中都不起作用,然后 JOIN 不起作用。

非常感谢

4

1 回答 1

1

我不完全确定我理解您的问题,但如果您只需要 IntIndex1 加入,您是否可以加入以下查询,而不是尝试将计算值实际保留在数据库中:

SELECT  *, 
        intInstrumentID + RANK() OVER(PARTITION BY intInstrumentID ORDER BY dDateStart ASC) AS IntIndex1
FROM    tbl

编辑:如果我正确理解了您的评论(不确定!),那么您大概知道您的结束日期和开始日期表具有完全相同的行数,这会导致它们之间基于 thir 进行一对一的映射仪器 ID 中的相应结束日期?

如果是这种情况,那么这个连接可能就是您正在寻找的:

SELECT SD.intInstrumentID, SD.dDateStart, ED.dEndDate
FROM
(
    SELECT  intInstrumentID, 
            dStartDate, 
            RANK() OVER(PARTITION BY intInstrumentID ORDER BY dDateStart ASC) AS IntIndex1
    FROM    tblStartDate
) SD
JOIN
(
    SELECT  intInstrumentID, 
            dEndDate, 
            RANK() OVER(PARTITION BY intInstrumentID ORDER BY dEndDate ASC) AS IntIndex1
    FROM    tblStartDate
) ED
    ON  SD.intInstrumentID = ED.intInstrumentID
    AND SD.IntIndex1 = ED.IntIndex1

如果没有,请您发布一些表格和预期结果的示例数据吗?

于 2012-12-05T13:43:50.917 回答