【问题标题】:Using LEAD to get next date使用 LEAD 获取下一个日期
【发布时间】:2018-03-20 12:39:32
【问题描述】:

我需要创建一个回答以下问题的查询:

我想返回阅读日期为 26 天的注册数量,阅读日期为 27 天的条目数,最多为 31 天,过去 6 个月。我需要你保持这样的状态:

我的预期输出是这样的:

LOCALE   COMPETENCE    Reading_date(DAYS)     INSCRIPTION (Quantity)
------    ----         ----------             ---------
CEARA    JAN18          26                      20
CEARA    JAN18          27                      02
CEARA    JAN18          28                      34
CEARA    JAN18          29                      07
CEARA    JAN18          30                      12
CEARA    JAN18          31                      11
CEARA    FEV18          26                      21
CEARA    FEV18          27                      09

(然后走……)

但我的桌子是这样的:

INSCRIP  COMPETENCE     Reading_date
00183938    201801      2018-01-02
00183938    201802      2018-02-01
00183946    201709      2017-09-01
00183946    201710      2017-10-01
00183946    201711      2017-11-01

我正在尝试的 sql 是这样的(请抽象连接):

select top 10   LOCALE
               , COMPETENCE
               , lead(Reading_date, 1) over (PARTITION by Reading_date ORDER BY Reading_date) next_lecture
               , datediff(day, Reading_date, next_lecture) Reading_date
               , INSCRIPTION
from BASE o
join LOCALE l
on u.localidade = l.cod_localidade
group by LOCALE, COMPETENCE, Reading_date, INSCRIPTION

有人帮帮我吗?感谢和抱歉英语不好

【问题讨论】:

  • 我不了解源数据和期望的结果。你能解决这个问题吗?并解释您如何计算阅读天数,因为它似乎不仅仅基于一行中的阅读日期。
  • 为了计算我使用 datediff,但问题出在这里 =/
  • 我相信问题出在这里:datediff(day, Reading_date, **next_lecture**)(星号之间的部分)。您正在尝试通过别名引用 SELECT 中的另一个字段;你不能那样做。您必须提供完整的表达式。当您收到错误并发布问题时,请始终在您的帖子中提供错误;否则,您最终只会遇到试图帮助您不理解的人,或者不得不玩“猜谜游戏”(就像我在这里所做的那样)。
  • 很抱歉,错误是:Mensagem 207, Nível 16, Estado 1, Linha 27 Nome de coluna 'next_lecture' inválido。
  • 如果 next_lecture 列不包含在聚合函数或 group by 子句中,则不能使用它

标签: sql sql-server lag lead


【解决方案1】:

我发表了评论,但我也会将其作为答案发布。这个错误很容易解释:

消息 207,级别 16,状态 1,第 27 行无效的列名称“next_lecture”。

您的表中没有列 next_lecture。那是因为,就像我在评论中所说:

您正试图通过别名引用 SELECT 中的另一个字段;你不能那样做。

唯一您可以通过查询本身的别名引用字段的位置(因此不能在查询之外,例如在使用子查询时)位于ORDER BY 子句中;其他任何地方都会导致错误。因此,像这样的简单语句将失败:

SELECT 1 + 1 AS Two, Two * 2 AS Four;

您必须提供完整的表达式,因此:

SELECT 1 + 1 AS Two, (1 + 1) * 2 AS Four;    

因此,您的查询变为:

SELECT DISTINCT TOP 10
       LOCALE,
       COMPETENCE
       LEAD(Reading_date, 1) OVER (PARTITION by Reading_date ORDER BY Reading_date) AS next_lecture
       DATEDIFF(DAY, Reading_date, LEAD(Reading_date, 1) OVER (PARTITION by Reading_date ORDER BY Reading_date)) Reading_date
       INSCRIPTION
FROM BASE o
     JOIN LOCALE l ON u.localidade = l.cod_localidade;

注意我还删除了GROUP BY 并使用了DISTINCT。您的查询中没有聚合函数,所以我假设这就是您尝试使用它的目的。

编辑:随机猜测 OP 想要什么,但它没有到达那里。我添加了这个供他们参考,但是,事情还不清楚:

WITH VTE AS (
    SELECT INSCRIP,COMPETENCE,CONVERT(date,reading_date) AS Reading_date
    FROM (VALUES('00183938',201801,'20180102'),
                ('00183938',201802,'20180201'),
                ('00183946',201709,'20170901'),
                ('00183946',201710,'20171001'),
                ('00183946',201711,'20171101')) V(INSCRIP,COMPETENCE,reading_date))
SELECT COMPETENCE,
       LEAD(Reading_Date) OVER (/*PARTITION BY LOCALE*/ ORDER BY Reading_Date) AS next_lecture,
       DATEDIFF(DAY,Reading_date, LEAD(Reading_Date) OVER (/*PARTITION BY LOCALE*/ ORDER BY Reading_Date)) AS ReadingDate,
       INSCRIP
FROM VTE
ORDER BY Reading_date ASC

【讨论】:

  • 不工作...我可以用葡萄牙语创建一个新问题或编辑所有这些解释我想要什么吗?
  • “不工作”为什么不呢?是的,还有一个供葡萄牙语用户使用的 Stackoverflow 网站。
  • 但我没有在 Stackoverflow 葡萄牙语中发布任何内容,因为那里没有回应。我更喜欢这里,虽然我有困难。我将编辑我的问题以显示发生了什么
  • “我什么都不发布”是双重否定,这意味着你确实发布了一些东西。 :)
  • kkkkkkk,你能继续帮我吗?这是葡萄牙语链接:pt.stackoverflow.com/questions/285473/…
猜你喜欢
  • 1970-01-01
  • 2012-12-11
  • 2016-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多