【问题标题】:How to solve below logic, using sql server?如何解决以下逻辑,使用 sql server?
【发布时间】:2015-11-23 12:13:37
【问题描述】:

我的表中有 3 列:col1col2col3

col2 is having (1,      0,   2,   3,   4,   0,   1,   3) 
col3 is having (1234,1023,1025,1032,1234,1013,1325,1332) 

我必须将col1 值设为

(1234,1234,1234,1234,1234,1013,1013,1013)

逻辑是我必须为col1 获取col3 值,直到第二列中重复相同的数字。

请给我任何解决这个问题的建议。

【问题讨论】:

  • 您为获得 col1 值而给出的逻辑没有意义。请多解释一下为什么col1 中的前5 行的值是1234
  • 但是表中的行是无序的。您也需要某种顺序列。
  • 至少显示输出欲望。“我必须获取 col1 的 col3 值,直到第二列中重复相同的数字。”这个不清楚。重新解释一下。

标签: sql sql-server sql-server-2008 sql-server-2005


【解决方案1】:

我怀疑col2 有计数,col3 有值,尽管您的示例数据并没有真正说明这一点。做你想做的事情的一种方法是使用数字表,所以这里有一个方法:

with numbers as (
      select row_number() over (order by (select null)) as n
      from masterl.spt_values
     )
select t.col2
from t join
     numbers n
     on t.col3 <= n.n;

如果您更喜欢不依赖于未记录系统表的解决方案:

with numbers as (
      select 1 as n, max(col2) as maxn
      from t
      union all
      select n + 1, maxn
      from numbers
      where n < max
     )
select t.col2
from t join
     numbers n
     on t.col3 <= n.n
option (MAXRECURSION 0);

【讨论】:

    【解决方案2】:

    我建议在您的表中添加一个IDENTITY 列,您可以按如下方式执行此操作:

    ALTER TABLE t
    ADD ColID int IDENTITY(1,1)
    

    或者通过新建表来确保数据顺序正确:

    CREATE TABLE t (ColID int IDENTITY(1,1), Col1 int, Col2 int, Col3 int)
    

    要回答这个问题,我需要使用带有标识列的表,所以首先插入数据..

    INSERT t (Col2, Col3)
    VALUES (1,1234),
        (0,1023),
        (2,1025),
        (3,1032),
        (4,1234),
        (0,1013),
        (1,1325),
        (3,1332),
        (5,1523),
        (4,1234)
    

    然后,使用公用表表达式cte,您可以为第一列生成结果,如果在上面的数据中找到第二列中的值,则该结果只会更改为新的第三列值,当按标识列排序时:

    ;WITH cte as (
        SELECT ColID, 
            row_number() over (partition by Col2 order by ColID) count2,
            col2,
            col3
        FROM t
        )
    
    SELECT t1.ColID, t2.Col3 Col1, t1.Col2, t1.Col3
    FROM (
        SELECT c1.ColID,
            c1.Col2,
            c1.Col3,
            MAX(c2.ColID) ValColID
        FROM cte c1
        LEFT JOIN cte c2 ON c2.ColID <= c1.ColID AND (c2.count2 > 1 OR c2.ColID = 1)
        GROUP BY c1.ColID,c1.Col2,c1.Col3
        ) t1
    INNER JOIN cte t2 ON t1.ValColID = t2.ColID
    

    【讨论】:

      猜你喜欢
      • 2015-06-08
      • 2013-10-28
      • 1970-01-01
      • 2023-03-13
      • 2012-07-21
      • 2016-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多