【问题标题】:How to set a new SQL variable based on a DateTime and an other variable?如何根据 DateTime 和其他变量设置新的 SQL 变量?
【发布时间】:2021-01-15 03:19:13
【问题描述】:

我之前的问题已回答 (here),但我想扩展它。为了避免混淆,我在这个问题中问它:

我有一个测试结果失败的 SQL 表:

Run           Test              StartTime              Result
1             20                2020-01-01 00:01       Failed
1             20                2020-01-01 00:00       NotExecuted
1             20                2020-01-01 00:04       Timeout
2             21                2020-01-01 00:10       Failed
2             21                2020-01-01 00:03       Failed

这张表告诉我测试失败了,但我想知道它是第一次、第二次还是第三次测试。我也想知道我在看哪个测试。使用大写字母似乎是一个合理的想法,只要 Result 中的每个值作为不同的起始字母,现在就是这样。不过我对其他想法持开放态度。

Run           Test              StartTime              Result          ResultStatus
1             20                2020-01-01 00:01       Failed          nFt
1             20                2020-01-01 00:00       NotExecuted     Nft
1             20                2020-01-01 00:04       Timeout         nfT
2             21                2020-01-01 00:10       Failed          fF
2             21                2020-01-01 00:03       Failed          Ff

当使用另一个问题的答案中所说的复制功能时,我如何才能扩展到更多结果?

【问题讨论】:

  • 请解释ResultStatus 的含义以及您希望如何计算它。
  • 人眼很难看到“F”与“f”。这是一个糟糕的编码想法。
  • @SMor 在程序中我将使用图标,我根据字母确定,所以用户不会看到这样的字母。

标签: sql sql-server string count window-functions


【解决方案1】:

如果我理解正确,您可以使用string_agg() 构造它:

select t.*,
       string_agg(lower(left(result, 1)), '') within group (order by starttime) over (partition by run, test) as resultstatus
from t;

很遗憾,SQL Server 不支持将string_agg() 作为窗口函数。所以让我们使用一个子查询:

select t.*,
       (select string_agg(lower(left(t2.result, 1)), '') within group (order by t2.starttime) 
        from t t2
        where t2.run = t.run and t2.test = t.test
       ) as resultstatus
from t;

当前测试的大写是棘手的。这是一种方法:

select t.*,
       stuff(rs, seqnum, 1, left(result, 1)) as resultstatus
from (select t.*,
             (select string_agg(lower(left(t2.result, 1)), '') within group (order by t2.starttime) 
              from t t2
              where t2.run = t.run and t2.test = t.test
             ) as rs,
             row_number() over (partition by run, test order by starttime) as seqnum
      from t
     ) t;

Here 是一个 dbfiddle。

【讨论】:

  • 这正是我想要的,谢谢!你有提示如何更好地处理这样的高级查询吗?我认为微软的文档有点模糊。
  • @Japie07 。 . .实践。当然,我还写了一本我推荐的关于这个主题的书。
猜你喜欢
  • 2021-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-15
  • 1970-01-01
  • 2018-07-02
  • 2022-01-11
  • 2013-04-28
相关资源
最近更新 更多