如何根据唯一ID列选择值

时间:2016-04-08 12:55:18

标签: sql sql-server database

请帮助我,

我有3列的表,当我选择列时我需要根据id来设置值

  Id      Days      Values
   1      5         7
   1     NULL      NULL
   1     NULL      NULL
   2      7         25
   2     NULL      NULL
   2      8        274
   2     NULL      NULL

我需要一个结果

  Id     Days      Values
   1      5         7
   1      5         7
   1      5         7
   2      7         25
   2      7         25
   2      8         274
   2      8         274

`

1 个答案:

答案 0 :(得分:1)

生成一组具有所需重复值的数据(B)。然后返回到包含要重复的记录数的基集(A)。这假设每个ID只会填充一个记录。如果不是这种情况,那么你将无法得到理想的结果。

SELECT B.ID, B.MDays as Days, B.Mvalues as values 
FROM  TABLE A
INNER JOIN (SELECT ID, max(days) mDays, Max(values) Mvalues
            FROM Table
            GROUP BY ID) B
 on A.ID = B.ID

由于有问题的更新....--

这会让你接近但没有办法在ID中定义分组我不能将记录细分为2和2

SELECT B.ID, B.Days as Days, B.values as values 
FROM  TABLE A
INNER JOIN (SELECT Distinct ID, days, values
            FROM Table
            GROUP BY ID) B
 on A.ID = B.ID
 and A.days is null

这还不够,因为我们仍然不知道如何订购行...... 它假定表中的顺序是不可信任的。我们使用Row_number Over语法为表中的每一行生成一个行号。使用ID和日期以及ID天的顺序进行分组(由于空值而无效)

然后,我们将此数据集重新加入ID和日期的一组不同值 让我们接近......但我们仍然需要一些分组逻辑。超出处理空记录和缺乏顺序或分组的ID。

With CTE AS (
SELECT ID, Days, Values, Row_Number() Over (partition by ID, Days ORDER BY ID, Days) RN
FROM Table)

SELECT * 
FROM (SELECT Distinct ID, Days, Values, max(RN) mRN FROM CTE GROUP BY ID, Days, Values) A
INNER JOIN CTE B
  ON A.ID = B.ID
 and A.Days = B.Ddays
 and mRN <= B.RN
Order by B.RN