我很感谢您对此代码提供了一些帮助,我发现了一个缺少关键字的关键字'错误。我之前从未使用过Lag功能,所以希望我能正确使用它。谢谢你的帮助。 GAV
typedef struct{
int day, month, year;
} Date;
typedef struct{
char *first_name, *last_name;
int id;
Date birthday;
} Person;
void ReadDate(Date *a)
{
printf("insert day, month, year\n");
scanf("%d%d%d", &a->day, &a->month,&a->year);
}
void ReadPerson(Person *b)
{
char temp_first_name[21];
char temp_last_name[21];
printf("insert first name:\n");
gets(temp_first_name);
b->first_name = (char*)malloc(strlen(temp_first_name)+1);
strcpy(b->first_name,temp_first_name);
//need to check malloc (later)
printf("insert last name:\n");
gets(temp_last_name);
b->last_name = (char*)malloc(strlen(temp_last_name)+1);
strcpy(b->last_name, temp_last_name);
//need to check malloc (later)
printf("insert id\n");
scanf("%d",&b->id);
printf("insert person's birthday:\n");
ReadDate(b);
}
答案 0 :(得分:2)
问题在于CASE表达式;你正确使用LAG。
其他要点:不要在数字上添加'1'
和'-1'
等字符串。添加数字 - 您不需要单引号。
另外,如果在计算中某些东西是常见的,只有"最后一部分"不同的是,您可以在结尾处使用CASE表达式"#34;。如下所示:
注意:重新阅读原帖,公式需要更复杂(我没有完全正确)。没有改变答案,因为它仍然说明了我想分享的相同想法。但是:看一下原帖,有一个条件" when LAG = 0 and LAG = -1
" - 这永远不可能是真的。这意味着可能是" OR"而不是" AND"。在下面写的公式中,这意味着再增加一个WHEN...THEN...
分支。
LAG(DATE_FLAG) OVER (ORDER BY DATE)
+ CASE LAG(DATE_FLAG) OVER (ORDER BY DATE ) WHEN 1 THEN 1
WHEN 0 THEN -1
ELSE 0 END AS DATE_STEP
进一步编辑:再看一遍,看来当标志为1,0或-1时,我们必须加1,否则加0 ......那么它更容易使用"简单的CASE表达式"而不是搜索到的CASE表达式"就像我一样。类似的东西:
LAG(...) ...
+ CASE WHEN LAG(...) ... IN (-1, 0, 1) THEN 1
ELSE 0 END AS DATE_STEP
答案 1 :(得分:0)
试试这个
CREATE VIEW GS_Date AS
SELECT DATE_DATE,
DATE_FLAG,
CASE
WHEN LAG(DATE_FLAG) OVER(ORDER BY DATE_DATE) = '1' THEN
(LAG(DATE_FLAG) OVER(ORDER BY DATE_DATE)) + '1'
WHEN LAG(DATE_FLAG) OVER(ORDER BY DATE_DATE) = '0' AND LAG(DATE_FLAG) OVER(ORDER BY DATE_DATE) = '-1' THEN
(LAG(DATE_FLAG) OVER(ORDER BY DATE_DATE)) + '1'
ELSE
LAG(DATE_FLAG) OVER(ORDER BY DATE_DATE)
END AS DATE_STEP
FROM DATE_GROUP
答案 2 :(得分:0)
因此,您不必继续编写LAG( ... ) OVER ( ... )
语句,在子查询中获取LAG
值,然后在外部查询中使用CASE
或DECODE
:
CREATE VIEW GS_Date AS
SELECT DATE_DATE,
DATE_FLAG,
DECODE(
DATE_STEP,
1, 2,
0, 1,
-1, 0,
DATE_STEP
) AS DATE_STEP
FROM (
SELECT DATE_DATE,
DATE_FLAG,
LAG ( DATE_FLAG ) OVER ( ORDER BY DATE_DATE ) AS DATE_STEP
FROM DATE_GROUP
)'
此外,您的第二个WHEN
子句永远不会成立:
WHEN LAG ( DATE_FLAG ) OVER ( ORDER BY DATE_DATE ) = '0'
AND LAG ( DATE_FLAG ) OVER ( ORDER BY DATE_DATE ) = '-1'
THEN ...
由于该值不能同时为-1
和0
。我假设您打算使用OR
而不是AND
。