Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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中增加值_Sql_Sql Server 2008_Tsql - Fatal编程技术网

如何基于唯一键在SQL中增加值

如何基于唯一键在SQL中增加值,sql,sql-server-2008,tsql,Sql,Sql Server 2008,Tsql,如果一些触发解决方案已经涵盖了这一点,我会提前道歉,但我无法让它们适用于我的场景 我有一个超过50000行的表,所有行都有一个ID,大约有5000个不同的ID值。表中可能有100行的instrumentID=1和50行的instrumentID=2等,但它们的列条目略有不同。这样我就可以写一封信了 SELECT * from tbl WHERE instrumentID = 1 然后让它返回100行(我知道这很简单,但只是为了澄清) 我需要做的是在每次找到仪器ID时形成一个递增的值,所以我尝

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

我有一个超过50000行的表,所有行都有一个
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,
在表中创建步骤

但是,我需要
IntIndex1
在找到
instrumentID
时递增,而不管记录在表中的什么位置,这样它就可以仅通过查看最后一个
IntIndex1
值有效地提供记录计数。而不是上面所做的,不管
instrumentID
如何,表的所有行都会递增,因此您将得到50014002403等

例如:对于仪器5000和4000

intInstrumentID  | IntIndex1
--------- ------------------
    5000         |   5001
    5000         |   5002
    4000         |   4001
    5000         |   5003
    4000         |   4002
我之所以需要这样做,是因为我需要基于这些值(每个
instrumentID
的开始和结束日期)连接两个表。我尝试了
groupby
etc,但这在两个表中都不起作用,连接也不起作用


非常感谢

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

SELECT  *, 
        intInstrumentID + RANK() OVER(PARTITION BY intInstrumentID ORDER BY dDateStart ASC) AS IntIndex1
FROM    tbl
编辑:如果我正确理解您的评论(这是不确定的!),那么您可能知道您的结束日期表和开始日期表具有完全相同的行数,这导致它们之间根据仪器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

如果没有,请发布两个表的示例数据和预期结果?

这是一个很好的答案。如果您希望它是一个真实的列,只需添加一个新的空列,然后像这样填充它。如果您的仪器ID为1000、2000、3000,则可以。如果它们是1,2,3,1,2,那么你就一团糟,因为你会把1变成11,变成12。所以一个小小的加法,加一个句点,把你的列变成一个小数。这样你就可以把1变成1.1和1.2,而不是11和12;我有两个表,它们需要在递增的instrumentID上连接在一起,对于每个开始日期,都有一个对应的结束日期(并且只有1个)。因此,有一个“开始日期”表和一个“结束日期”表,每个表都应该按日期顺序递增,以便在联接之后的最后一个表中,在结束日期旁边有一个开始日期。RANK函数很有用,但是对于顶级,只返回1,然后返回2等等,而我需要它在分区内递增。另外,谢谢你把我介绍给OVER。谢谢Fergus-你的答案和我今天来这里写的答案几乎一样,但是我在创建表格的时候把排名写了一遍。这是因为我希望能够验证两个表中的随机样本。