我的数据库无法获得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的第一个事件进行编号并给它一个值。
问题:
我需要的是一个全新的视角和帮助。我这太难了吗?
答案 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)
为什么不添加增量列,使用模数更新表以确定它是偶数还是奇数,然后删除列?