当前位置: 首页 > 知识库问答 >
问题:

我的查询在每个名称的“n”行上方的一列中显示“n”个最近日期。我想要每个名字的“n”最近日期栏

仲智
2023-03-14

对于我的具体情况,n=4,但可能有一天需要n=5或n=6。

我需要的顶级描述:我有一个表单,允许我将名称和日期添加到跳转日志中。我需要构建一个查询,该查询将显示每个跳转器的四个最近跳转,每个日期有一列。

我的表单将数据存储在“JUMP”表中,该表有3个字段:JUMPID、NAME、DATE。示例数据如下所示:

JUMPID   NAME   DATE
1        Joe    01-Jul-16
2        Joe    15-Jul-16
3        Adam   15-Jul-16
4        Joe    26-Jul-16
5        Ryan   28-Jul-16
6        Adam   02-Aug-16
7        Joe    10-Aug-16
8        Adam   10-Aug-16
9        Joe    12-Aug-16
10       Mike   19-Aug-16
11       Joe    19-Aug-16
12       Mike   19-Aug-16
13       Dave   19-Aug-16
14       Ryan   23-Aug-16

我现在使用的查询返回每个跳线最近的4次跳转,但将所有日期存储在同一列中。查询是:

Select NAME, [DATE]
From [JUMP]
Where DATE In
   (Select Top 4 [DATE]
    From [JUMP] jum
    Where [JUMP].[NAME] = jum.[NAME]
    Order By jum.[DATE] DESC;)
Order By NAME, [DATE] DESC;

此查询的输出如下所示:

NAME    DATE
Adam    10-Aug-16
Adam    02-Aug-16
Adam    15-Jul-16
Dave    19-Aug-16
Joe     19-Aug-16
Joe     12-Aug-16
Joe     10-Aug-16
Joe     26-Jul-16
Mike    19-Aug-16
Mike    19-Aug-16
Ryan    23-Aug-16
Ryan    28-Jul-16

我想要的是,这4个最近的跳转都有自己的列,如下所示:

NAME    RECENT1     RECENT2     RECENT3     RECENT4
Adam    10-Aug-16   02-Aug-16   15-Jul-16
Dave    19-Aug-16
Joe     19-Aug-16   12-Aug-16   10-Aug-16   26-Jul-16
Mike    19-Aug-16   19-Aug-16
Ryan    23-Aug-16   28-Jul-16

重复的日期是可以的,因为同一个跳投者可能一天跳不止一次。对于跳转次数少于4次的跳转,可以将字段设置为空或空。

我已经使用了谷歌的一半,它帮助我构建了上面的查询。任何帮助我达到我首选的最终状态的帮助都将非常感激。

共有1个答案

勾炜
2023-03-14

我花了几个小时试图使用转换解决我的问题。。。Serg建议的MS Access中的PIVOT方法未成功。我认为这主要是因为缺少一个额外的字段,将每个跳跃分类为最近的1、2、3、4或不再跟踪。我想不出一种方法可以做到这一点,而不更新每个跳投者每次跳投时的记录。在这方面我可能是错的,我不确定,因为我又不是专家。如果有一种方法可以将值1、2、3、4分配给原始查询作为计算字段(?)返回的每个跳转,我会使用转换方法。

也就是说,我确实找到了一个大部分有效但在我看来很笨拙的解决方案。我这么说主要是因为如果跳转者一天跳一次以上,它就会崩溃。我的部分解决方案包括创建4个单独的查询来分别识别第一、第二、第三和第四次最近的跳转,然后将这4个查询组合成最终查询。

这四个查询如下所示:

Select NAME, DATE
From JUMP As jum
Where (
       Select Count(NAME)
       From JUMP
       Where NAME = jum.NAME
       AND DATE > jum.DATE) = 0;   (0 gives me most recent, 1 second most recent, etc.)

在这个stackoverflow问题上,Charles Bretana负责这个查询。我真的不明白它是如何做到这一点的,但它能满足我的需要,除非跳投有一次以上的跳跃。

然后使用这4个查询,我构建了另一个将4合并为1的查询。此查询如下所示:

SELECT Query1.NAME, Query1.DATE, Query2.DATE, Query3.DATE, Query4.DATE
FROM ((Query2 RIGHT JOIN Query1 ON Query2.NAME=Query1.NAME)
       LEFT JOIN Query3 ON Query1.NAME = Query3.NAME)
       LEFT JOIN Query4 ON Query1.NAME = Query4.NAME
ORDER BY query1.NAME;

这为我提供了所需格式的数据:包含名称的行和4列,每个行用于最近的第1次/第2次/第3次/第4次跳跃,但当一天中有一个跳跃超过一次时会中断。使用上述原始样本数据,生成的数据表如下所示:

NAME    RECENT1    RECENT2    RECENT3    RECENT4
Adam    10-Aug-16  02-Aug-16  15-Jul-16
Dave    19-Aug-16
Joe     19-Aug-16  12-Aug-16  10-Aug-16  26-Jul-16
Mike    19-Aug-16
Mike    19-Aug-16
Ryan    23-Aug-16  28-Jul-16

如果有更优雅的解决方案,我很乐意看到。或者,如果有人知道如何解决我一天内跳转不止一次的问题,我希望得到一些帮助。谢谢

 类似资料:
  • 问题内容: 我试图弄清楚如何编写一个MySQL查询,该查询将返回日期最近的3个事件。 这是我的桌子: 因此,查询结果应为ID的1,2,5,因为它们是与当前日期相比最接近的ID。 编辑: 查询应该只找到将来的事件。 问题答案: 这意味着1天前的事件与将来1天的事件一样接近。如果您只想要尚未发生的事件,请执行

  • 假设我有一个像下面这样的数据,有名称、类和日期 我正在寻找一个输出,这将给我的每个名字的值计数,他们各自的等级和最早的日期和最新的日期。我的输出是, 我能够找到每个名字的计数, 但无法在“日期”列中找到“最早日期”和“最晚日期”。 有人能帮我吗?

  • 问题内容: 我有以下查询,它为每个查询获取最新的N : 我有指标的,,。 这是我想出的唯一解决方案,每个站最多可以获取单个记录。但是,它非常慢(81000条记录的表为154.0毫秒)。 如何加快查询速度? 问题答案: 假设至少Postgres 9.3。 指数 首先,多列索引将有助于: 的拟合度稍好一些,但如果不使用,索引仍将以几乎相同的速度向后扫描。 假设已定义,否则在索引 和 查询中考虑: Po

  • 问题内容: 我在Postgres 9.3数据库中有一个方案,在该方案中,我必须获取出售书籍的最近10个日期。考虑以下示例: table中目前没有任何限制,但是我们有一项服务,每天只插入一个计数。 我必须获得基于的结果。当我传递ID时,应使用书名,出售日期和出售份数生成报告。 所需的输出: 问题答案: 这看起来并不令人怀疑,但这 是个难题 。 假设条件 你的数目是。 表格中的所有列均已定义。 该表在

  • 问题内容: 我有以下数据框: 我需要以某种方式重塑数据框,以使每个id的前3列具有最高的值。结果将是这样的: 它显示了每本广告的前三名最畅销书。我已经使用R中的包完成了此操作,但是我正在寻找等效的pandas。 问题答案: 您可以用来查找每一行的 n个 最大项的索引: 产量

  • 问题内容: 我有一张桌子上有用户帖子。我需要显示每天每位用户从1到最多n条帖子。 例子: 我需要一个查询,例如返回每个用户每天最多2条帖子的查询: 我尝试使用GROUP和HAVING,但是我仅获得前n个记录,而不是每个用户每天的前n个记录: 问题答案: 试试这个糟糕的SQL代码:) 结果: 在这里摆弄。 我认为如果按日期降序排序会更合适,因为实际上是最接近当前日期的前2位。