【问题标题】:How to count SQL based on a DateTime and an other variable?如何根据 DateTime 和其他变量计算 SQL?
【发布时间】:2021-01-11 05:50:55
【问题描述】:

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

Run           Test              DateTime
1             20                2020-01-01 00:01
1             20                2020-01-01 00:00
1             20                2020-01-01 00:04
2             21                2020-01-01 00:10
2             21                2020-01-01 00:03

这张表告诉我测试失败了,但我想知道它是第一次、第二次还是第三次测试。最后,我想用一个标志来做,其中 x 代表失败的测试,X 代表相关的测试,就像这样:

Run           Test              StartTime              Status
1             20                2020-01-01 00:01       xXx
1             20                2020-01-01 00:00       Xxx
1             20                2020-01-01 00:04       xxX
2             21                2020-01-01 00:10       xX
2             21                2020-01-01 00:03       Xx

它必须与 COUNT 和 SUM 做一些事情,但我找不到从这个案例开始的地方。你能帮帮我吗?

【问题讨论】:

  • 为了记录:列名 DateTime 和 StartTime 应该是相同的。因为不同的答案都使用它们,所以我不会改变它。

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


【解决方案1】:

基本上,你想要row_number() 和一个窗口count()

select t.*, 
    row_number() over(partition by run, test order by datetime) rn,
    count(*) over(partition by run, test) cnt
from mytable t

从那里开始,您可以使用字符串函数生成“状态”:

select t.*, 
    replicate('x', rn - 1) + 'X' + replicate('x', cnt - rn) status
from (
    select t.*, 
        row_number() over(partition by run, test order by datetime) rn,
        count(*) over(partition by run, test) cnt
    from mytable t
) t

Demo on DB Fiddle

运行 |测试 |日期时间 | rn | cnt |状态 --: | ---: | :--------------- | -: | --: | :----- 1 | 20 | 2020-01-01 00:00 | 1 | 3 | xxx 1 | 20 | 2020-01-01 00:01 | 2 | 3 | xXx 1 | 20 | 2020-01-01 00:04 | 3 | 3 | xxx 2 | 21 | 2020-01-01 00:03 | 1 | 2 | XX 2 | 21 | 2020-01-01 00:10 | 2 | 2 | xX

【讨论】:

  • 谢谢,这就是我要找的!据我了解:左右功能仅用于定义您想要多少个x?如果你从左到右改变,反之亦然没关系?
  • @Japie07:是的,你是对的。这让我认为我们不需要left()right(),我们可以将逻辑移至replicate()。我更新了我的答案。
【解决方案2】:

这似乎是一个奇怪的要求,但我认为这是你想要的:

select stuff(replicate('x', count(*) over (partition by run, test)),
             row_number() over (partition by run, test order by starttime), 1, 'X'
            ) as status
from t;

这使用字符串操作来构造状态字符串。

【讨论】:

  • @GMB 。 . .它也更简单,而且比它早了几分钟。唉。
猜你喜欢
  • 2021-01-15
  • 1970-01-01
  • 2021-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多