我们正在尝试跟踪我们部门中的应用程序和单元测试用法,因此我创建了一个数据库来跟踪这一情况。我有一个应用程序表,首先,我在应用程序表中创建了一个 UnitTests 列,但我刚刚意识到这一点,只需将其保留到日期,它将覆盖该应用程序的单元测试历史记录。
由于我希望能够随时间提取数据以生成显示进度的图表,我意识到我需要一个名为 UnitTestTracking 的单独表格,其中包含以下列:
通过这种方式,人们可以每周一次或每月一次在此表中添加新条目,我们将随时间推移显示每个应用程序的进度以及所有应用程序的总数。
现在的一个问题是:如何针对此表编写查询以获取所有应用程序的总计数,因为不同的应用程序将在不同的时间在此表中添加条目?
基本上(在伪SQL中)我需要类似的东西:
“选择应用程序data_added是为该应用程序ID添加的最新日期的所有应用程序中的单元测试计数”
您将如何撰写此查询?
答案 0 :(得分:6)
我认为人们似乎正在努力实现这一目标。
要解决此问题,您需要两个查询:
第一个SQL是:
SELECT application_ID, MAX(date_added) AS lastDateAdded FROM UnitTestTracking GROUP BY application_ID
对于第二个,我们通过嵌套查询来完成这项工作:
SELECT
SUM(unittestcount)
FROM
UnitTestTracking JOIN
(SELECT
application_ID, MAX(date_added) AS lastDateAdded
FROM
UnitTestTracking GROUP BY application_ID) T
ON UnitTestTracking.application_ID = T.application_ID AND
UnitTestTracking.date_added = T.LastDateAdded
这应该可以满足您的需求,即目前的单元测试总数。
答案 1 :(得分:4)
我认为原始设计有点偏,因此复杂。下面的设计建议每日(或更频繁)条目,但仅针对特定人员的特定应用计算当天。 Kimball星型模式允许按日期,按月,按年,按应用,按人,按职位等方式轻松切片和切块。
例如,在2008年,2009年,2010年的所有应用程序中
SELECT sum(TestCount) AS "Test Count"
FROM factTest AS f
JOIN dimApplication AS a ON a.ApplicationID = f.ApplicationID
JOIN dimPerson AS p ON p.PersonID = f.PersonID
JOIN dimDate AS d ON d.DateID = f.DateID
WHERE [Year] BETWEEN 2008 AND 2010
在2009年的所有申请中,仅在周五
WHERE [Year] = 2009 AND DayOfWeek = 'Friday'
在2009年的所有申请中,按人称。
SELECT FullName, sum(TestCount) AS "Test Count"
FROM factTest AS f
JOIN dimApplication AS a ON a.ApplicationID = f.ApplicationID
JOIN dimPerson AS p ON p.PersonID = f.PersonID
JOIN dimDate AS d ON d.DateID = f.DateID
WHERE [Year] = 2009
GROUP BY FullName
按申请人,按人数,按月计算,但仅限于周末
SELECT ApplicationName, FullName, [MonthName], sum(TestCount) AS "Test Count"
FROM factTest AS f
JOIN dimApplication AS a ON a.ApplicationID = f.ApplicationID
JOIN dimPerson AS p ON p.PersonID = f.PersonID
JOIN dimDate AS d ON d.DateID = f.DateID
WHERE [Year] = 2009 AND IsWeekend = 'Yes'
GROUP BY ApplicationName, FullName, [MonthName]
在2000 - 2009年的所有申请中,按月,按月,但仅限于接待员在星期二进行的测试。
SELECT [Year], [Month], sum(TestCount) AS "Test Count"
FROM factTest AS f
JOIN dimApplication AS a ON a.ApplicationID = f.ApplicationID
JOIN dimPerson AS p ON p.PersonID = f.PersonID
JOIN dimDate AS d ON d.DateID = f.DateID
WHERE [Year] BETWEEN 2000 AND 2009
AND JobTitle = 'Receptionist'
AND DayOfWeek = 'Tuesday'
GROUP BY [Year], [Month]
在所有申请中,2009年,由拥有两只或更多猫的短人在周末进行测试。
SELECT sum(TestCount) AS "Test Count"
FROM factTest AS f
JOIN dimApplication AS a ON a.ApplicationID = f.ApplicationID
JOIN dimPerson AS p ON p.PersonID = f.PersonID
JOIN dimDate AS d ON d.DateID = f.DateID
WHERE [Year] = 2009
AND IsWeekend = 'Yes'
AND IsShortPerson ='Yes'
AND CatsOwned >= 2
等等...
语法是sql server,但这里没什么特别的。
<强>更新强>
请注意FROM ... JOIN ... JOIN ... JOIN ...
始终相同。所有切片和切块都是通过SELECT, WHERE
和GROUP BY
完成的 - 无需“复杂查询”。
答案 2 :(得分:1)
您可以使用审核。这将创建您想要的日志。
要分隔不同的应用程序和单元测试,您可以为每个应用程序创建单独的用户。 它将简化查询谁测试的内容。
答案 3 :(得分:1)
这两个选项中的任何一个都适用于您的场景:
1具有为应用程序添加新单元测试计数的逻辑,在历史记录中插入记录+更新应用程序记录的单元测试计数。然后使用简单的选择覆盖应用程序记录 - 历史记录在此方案中无关。如果您在历史记录中有大量记录,这是最好的。
2直接对UnitTestTracking表使用此查询
select application_id, unittestcount from UnitTestTracking u1
where date_added = (
select max(date_added) from UnitTestTracking u2
where u1.application_id = u2.application_id
)
答案 4 :(得分:0)
“选择应用程序data_added是为该应用程序ID添加的最新日期的所有应用程序中的单元测试计数”
我担心我只能说这种要求的表述似乎一定是有缺陷的。
首先,查询中唯一的“自由变量”(即唯一的参数)似乎是“该应用程序ID”。
所以你的问题陈述似乎是:
(1)给定应用程序ID,获取该应用程序ID的最新(即MAX(...))date_added。 (2)鉴于最新日期,给我所有date_added等于(1)结果的应用程序 (3)鉴于该组应用程序,请给出“跨这些应用程序”的单元测试计数
第二:关于“跨越这些应用程序”,我必须说,我对关系代数的理解和对自然语言的理解都不能帮助我最直接地了解你的意思(特别是)。