SQL - 确定特定审计表中值增加和减少的位置

时间:2017-10-17 19:18:22

标签: sql sql-server tsql sql-server-2012 audit

我有两张桌子,基本上记录了KG用户可以存储在三个不同容器中的最大重量:

  • dbo.Storage包含用户的最新值(第一个屏幕截图)
  • dbo.AuditStorage基本上审核这些值的变化(第二个屏幕截图)

dbo.AuditStorage的工作方式如下(截图如下):

该表最初为空,当它首次被填充时,将自动插入3行(这由触发器完成):

  1. 插入了第一行,但只填充了Max_Storage1 剩余的存储空间保持为NULL。
  2. 之后几毫秒,插入另一行。 Max_Storage1值 持久化并填充Max_Storage2,而Max_Storage3 保持为NULL。
  3. 之后的几毫秒,插入了另一行。 Max_Storage1和 Max_Storage2值保持不变,最后是Max_Storage3值 人口稠密。
  4. Storage

    dbo.AuditStorage

    在上面的屏幕截图中,我们可以看到一个月后用户决定将他的Max_Storage1从50增加到100 将他的Max_Storage2从500减少到400。 这里应用了相同的逻辑:

    1. 首先插入一行并更新Max_Storage1,而其他Max_Storage_X重新映射
    2. 然后插入anoter行并更新Max_Storage2
    3. 由于Max_Storage3保持不变,因此不会插入任何行。
    4. 我的目标是能够编写一个查询,返回一个用户列表,其中一个Max_Storage_X值已经增加而另一个已经减少。

      我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:0)

我认为问题在于,您没有任何字段可以分组,以便进行自我联接,您需要进行比较。

以下是一些示例代码。您需要添加另一个OR条件来比较Max_storage1和maxstorage3,以及Max_storage2和maxstorage3

SELECT IDENTITY(int,1,1) AS rownum, * 
INTO #temp_audit
FROM dbo.Auditstorage
ORDER BY UPDATE_time

SELECT * FROM #temp_audit a
INNER JOIN #temp_audit b
ON a.rownum = b.rownum -2
AND a.userid = b.userid

WHERE 
(
    (a.Max_storage1 < b.Max_storage1 AND a.Max_storage2 > b.Max_storage2)
OR 
    (a.Max_storage1 > b.Max_storage1 AND a.Max_storage2 < b.Max_storage2)
)

答案 1 :(得分:0)

您可以尝试这样的事情:

RowID

我们的想法是为特定用户插入的每条记录计算CTE。然后在第二个log_df = pd.read_csv(file_name) nod_intervals = np.array([]) for index, row in log_df.iterrows(): if row['gesture'] == 'Nod' and row['label'] == 'y': nod_intervals = np.append(nod_intervals, (row['start'], row['end'])) print nod_intervals 中我们得到了这个结果:

enter image description here

我们有当前值(向上或向下)和之前的值(向上或向下)。因此我们只需要使用此行,当前值为负,而之前为正。