Oracle SQL LAG函数

时间:2017-01-27 13:26:07

标签: sql oracle lag window-functions

我很感谢您对此代码提供了一些帮助,我发现了一个缺少关键字的关键字'错误。我之前从未使用过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);
}

3 个答案:

答案 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值,然后在外部查询中使用CASEDECODE

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 ...

由于该值不能同时为-10。我假设您打算使用OR而不是AND