选择值发生变化的行

Posted

技术标签:

【中文标题】选择值发生变化的行【英文标题】:Select rows where value changes 【发布时间】:2010-12-20 07:00:12 【问题描述】:

我在访问数据库中有一个表格,其中包含职位描述、项目、日期和所需数量的列。对于每个描述,我想为每个工作/项目组合选择第一个日期条目,以及金额变化的行。

所以,如果我有

Job        proj date     amt
Programmer 105  01-01-11 3
Programmer 105  01-02-11 3
Programmer 105  01-03-11 2
Programmer 105  01-04-11 2
Programmer 105  01-05-11 3
Programmer 110  01-03-11 1
Programmer 110  01-04-11 2
Programmer 110  01-05-11 3
Manager    105  01-01-11 1
Manager    105  01-02-11 2
Manager    105  01-03-11 2
Manager    105  01-04-11 2
Manager    105  01-05-11 2

我要选择

Programmer 105  01-01-11 3
Programmer 105  01-03-11 2
Programmer 105  01-05-11 3
Programmer 110  01-03-11 1
Programmer 110  01-04-11 2
Programmer 110  01-05-11 3
Manager    105  01-01-11 1
Manager    105  01-02-11 2

我有一张可以使用的不同职位描述的表格。

【问题讨论】:

【参考方案1】:

nextamt 的第一个条目将始终为 Null:

SELECT j.Job,
    j.proj,
    j.Date,
    j.amt,
    (SELECT TOP 1 amt 
     FROM jobs q 
     WHERE q.job=j.job AND q.proj=j.proj AND q.date<j.date 
     ORDER BY [date] DESC) AS nextamt 
FROM jobs AS j 
WHERE ((SELECT TOP 1 amt 
        FROM jobs q 
        WHERE q.job=j.job AND q.proj=j.proj AND q.date<j.date 
        ORDER BY [date] DESC)) <>[amt] 
Or ((SELECT TOP 1 amt 
     FROM jobs q 
     WHERE q.job=j.job AND q.proj=j.proj AND q.date<j.date 
     ORDER BY [date] DESC)) Is Null

【讨论】:

【参考方案2】:

这可以通过 Oracle/SQL-Server/etc 中提供的分析(窗口)函数轻松完成(谷歌表示滞后、领先、first_value、last_value 等),但 Access 不支持它们,因此您必须做这样的自我加入:

SELECT 
    rows.Job, rows.proj, rows.dte, curr.amt 
FROM
    ((SELECT Data.Job, Data.proj, Data.dte, 
        (SELECT max(dte) 
         FROM data as prev 
         WHERE prev.job = data.job and 
               prev.proj = data.proj and 
               prev.dte < data.dte) AS prev_dte 
     FROM Data) as [rows] 
     INNER JOIN Data AS curr 
               ON (rows.dte = curr.dte) AND 
                  (rows.proj = curr.proj) AND 
                  (rows.Job = curr.Job)
)
    LEFT JOIN Data AS prev 
         ON (rows.prev_dte = prev.dte) AND 
            (rows.proj = prev.proj) AND 
            (rows.Job = prev.Job) 
WHERE 
    prev.amt<>[curr].[amt] OR 
    prev.Job Is Null;

因此,称为 [rows] 的内联视图会找到小于表中每个日期的最大日期,然后返回内部联接以获取当前行和上一行的外部联接,以便您选择第一行。

(代码格式有问题 - 抱歉。)

编辑:这是输出,我认为这是您需要的。

Job         proj    dte             amt
Programmer  105     01/01/2011  3 
Programmer  105     03/01/2011  2 
Programmer  105     05/01/2011  3 
Programmer  110     03/01/2011  1 
Programmer  110     04/01/2011  2 
Programmer  110     05/01/2011  3 
Manager     105     01/01/2011  1 
Manager     105     02/01/2011  2 

【讨论】:

以上是关于选择值发生变化的行的主要内容,如果未能解决你的问题,请参考以下文章

Oracle绑定变量窥探

UIPickerView 不会立即重绘未选中的行

Jquery 结合 easyUI 实现 当选择框中的值等于某一个值的时候,另一个combobox中的值发生变化。

为啥调用 location.reload(); 后我的表中的行顺序会发生变化?关闭模态框时

表格视图高度之外的行的单元格内容发生变化(要查看此单元格,我们向下滚动)?

pyqt5 用Qtableview鼠标滑过去时怎么样能经过的行发生颜色变化?