繁体   English   中英

Where 子句仅适用于部分视图

[英]Where clause only for part of the view

在@forpas 的帮助下,我有这个查询: dbfiddle

列 ROWdifferencesALWAYS 计算最后一行和它最后一次出现之间的行数。 完全独立于“日期”列。

我添加了 ROWdifferencesMAXDATE 列,因为我还想知道最后一行和它最后一次发生之间的行数,仅适用于最大日期(在本例中为 2022-01-14)。 对于此列,并非“数字”列中的所有可能值都存在。 在这种情况下,ROWdifferencesMAXDATE 应该是具有此 MAX(date) 的行数(在本例中为 3)。

其他列不应受此更改的影响。 我试过 WHERE MAX(date) 等,但后来我得到的记录较少。 这在某种程度上可能吗?

非常感谢您!

这个新专栏的预期结果:

数字 行差异MAXDATE
3个 3个
12 1个
14 0
25 3个
38 3个
41 2个
73 3个

您可以通过添加一个为每个日期的行编号的字段来扩展对上一个问题的答案,然后当该数字出现在该日期时,您可以根据该行号和最大日期值的总行数计算其 position; 否则它的 position 只是最大日期的总行数。

WITH gdata AS (
  SELECT MAX(date) AS maxdate,
         COUNT(*) AS numrows
  FROM numbers
),
rowdata AS (
  SELECT *,
         ROW_NUMBER() OVER (ORDER BY date, id) AS rn,
         ROW_NUMBER() OVER (PARTITION BY date ORDER BY id) AS drn,
         SUM(date = maxdate) OVER () AS numdate
  FROM numbers
  CROSS JOIN gdata
)
SELECT number,
       COUNT(*) AS occurrences,
       MIN(numrows - rn) AS ROWdifferencesALWAYS,
       MIN(CASE WHEN date = maxdate THEN numdate - drn
                ELSE numdate
           END) AS ROWdifferencesMAXDATE
FROM rowdata
GROUP BY number
ORDER BY number

Output:


number  occurrences ROWdifferencesALWAYS    ROWdifferencesMAXDATE
3       1           5                       3
12      1           1                       1
14      1           0                       0
25      1           7                       3
38      1           3                       3
41      2           2                       2
73      1           4                       3

dbfiddle 上的演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM