如何编写SQL查询以在行之间具有交替模式(如-1和1)?

时间:2014-12-02 20:59:40

标签: sql sql-server tsql sql-server-2012

我的数据库无法获得1 an -1的交替模式。

这解释了我想要做的事情。

ID  Purpose  Date      Val 
1   Derp     4/1/1969   1
1   Derp     4/1/1969  -1
2   Derp     4/2/2011   1
2   Derp     4/2/2011  -1

来自类似

的数据库
ID  Purpose  Date      
1   Derp     4/1/1969  
1   Herp     4/1/1911  
2   Woot     4/2/1311  
2   Wall     4/2/211  

这是我的尝试:

SELECT 
     ID 
     ,Purpose 
     ,Date
     ,Val as 1 
FROM (
     SELECT FIRST(Purpose) 
     FROM DerpTable WHERE Purpose LIKE '%DERP%' 
     GROUP BY ID, DATE) as HerpTable, DerpTable 
 WHERE HerpTable.ID = DerpTable.ID AND DerpTable.ID = HerpTable.ID

此查询对我不起作用,因为我的mssm无法识别' FIRST'或者' FIRST_VALUE'作为内置功能。因此,我没有办法对derp的第一个事件进行编号并给它一个值。

问题:

  • 我使用的是sql2012,因此无法使用First。
  • 我尝试使用last_value和first_value,如here所示,但是收到错误,表明找不到该功能
  • 一堆sql查询。我一直在盯着MSDN T-SQL帮助页面
  • 这是我的权利now

我需要的是一个全新的视角和帮助。我这太难了吗?

3 个答案:

答案 0 :(得分:3)

使用子查询以及ROW_NUMBER和模运算符:

select
    ID,
    Purpose,
    Date,
    case when rownum % 2 = 0 then 1 else -1 end as Val
from (
    SELECT 
        ID 
        ,Purpose 
        ,Date
        ROW_NUMBER() over (order by ID) as rownum
    FROM (
        SELECT 
            ID,
            Purpose,
            Date
        FROM DerpTable WHERE Purpose LIKE '%DERP%' 
        GROUP BY ID, DATE) as HerpTable, DerpTable 
        WHERE HerpTable.ID = DerpTable.ID AND DerpTable.ID = HerpTable.ID
) [t1]

ROW_NUMBER会为每一行分配一个值,在这种情况下,它是一个递增的值。将模数与2一起使用可以检查它是偶数还是奇数并分配1-1

注意:我不知道此查询是否会运行,因为我不知道您的数据库的体系结构,但这个想法应该让您到那里。

答案 1 :(得分:3)

您可以在SQL Server 2012中使用first_value()。我不确定查询中WHERE条件是什么,但以下内容应该会返回您想要的结果:

  SELECT ID,
         FIRST_VALUE(Purpose) OVER (PARTITION BY ID ORDER BY DATE) as Purpose,
         DATE,
         2 * ROW_NUMBER() OVER (PARTITION BY ID ORDER BY DATE) - 1
  FROM DERPTABLE

答案 2 :(得分:1)

为什么不添加增量列,使用模数更新表以确定它是偶数还是奇数,然后删除列?