【问题标题】:SQL query to accomplish the following this task?SQL查询来完成下面这个任务?
【发布时间】:2014-05-26 16:05:58
【问题描述】:

我的表格列如下:

Table 1 (Instance Table):

Name | Id | Duration | ConfigurationID


Table 2 (Class Table):

Configuration | Id | Last Changed

在我的表 2 中,我有如下配置名称的行。名称是代码生成的。:

Test 1
Copy of Test 1
Copy of Test 1 (1)
Copy of Test 1 (2)
Copy of Test 1 (3)
...
...
Test 2
Copy of Test 2
Copy of Test 2 (1)
Copy of Test 2 (2)
Copy of Test 2 (3)

表 1 包含不同配置的实例。例如,第 1-15 行可能是配置测试 1 的实例、测试 1 的配置副本的 16 - 30 个实例等。

我想找到一个配置类型的所有实例及其所有副本的平均持续时间,即行/列,如下所示:

Row/Column 1: Avg Duration of instances of type Test 1 and all of its copies (Copy of Test 1, Copy of Test 1(1), ...Copy of Test 1 (3));

Row/Column 2: Avg Duration of instances of type Test 2 and all of its copies (Copy of Test 1, Copy of Test 1(1), ...Copy of Test 1 (3));
....

我需要一些关于如何编写 SQL 查询来完成此任务的帮助。 到目前为止,我有这个:

SELECT AVG(i.[Duration]/1000.0) as [Avg Duration (s)]
FROM [Table 1] i
LEFT OUTER JOIN [Table 2] p
ON i.[ConfigurationID] = p.Id 
WHERE i.Name LIKE '(Copy of)%'
GROUP BY i.Name

【问题讨论】:

  • 所以,知道一个配置是否是另一个配置的唯一方法是因为Copy of 前缀?,这不是一个好方法。例如,我怎么知道Copy of Test 11 (1) 不是Test 1 的副本?
  • 另外,您使用的是 MySQL 还是 SQL Server?请使用适当的标签

标签: mysql sql sql-server database


【解决方案1】:
SELECT AVG(i.Duration / 1000) as "Avg Duration (s)"
FROM "Table 1" i
    LEFT JOIN "Table 2" p
        ON i.ConfigurationID = p.Id 
GROUP BY CASE
    WHEN i.Name LIKE 'C%' THEN SUBSTRING_INDEX(SUBSTR(i.Name, 9), ' ', 2)
    ELSE i.Name
END

“有趣”的部分是SUBSTRING_INDEX(SUBSTR(i.Name, 9), ' ', 2)

我们删掉最初的'Copy of ',然后得到第二个空格之前的所有内容。


您的问题被标记为。这个答案使用

【讨论】:

  • 我没试过,但我认为这里的语法是错误的。 LEFT的第二个参数不应该是int而不是字符串吗?
  • @AlvinThompson,查看修改后的答案。
  • 实际上,使用方括号 ([]) 而不是列名的反引号对 SQL Server 有很大的提示
  • @Lamak,你是对的......我从未在 MySQL 中看到过括号......我认为它们是合法的。
  • 我的评论更多是因为您的答案中使用了SUBSTRING_INDEX,这是SQL Server中不存在的一个函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-23
  • 1970-01-01
  • 2014-09-22
  • 1970-01-01
  • 2011-03-09
  • 1970-01-01
  • 2011-07-31
相关资源
最近更新 更多