如何基于唯一键在SQL中增加值
如果一些触发解决方案已经涵盖了这一点,我会提前道歉,但我无法让它们适用于我的场景 我有一个超过50000行的表,所有行都有一个如何基于唯一键在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时形成一个递增的值,所以我尝
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-你的答案和我今天来这里写的答案几乎一样,但是我在创建表格的时候把排名写了一遍。这是因为我希望能够验证两个表中的随机样本。