sql server比较一个表中的行

时间:2014-11-29 18:37:35

标签: asp.net sql-server vb.net

我想跟踪系统设置的变化,并在Web应用程序ASP.net VB中显示它们。 设置信息/数据存储在如下表格中:

TABLE 1

| SNR | LENSE | CAMERA | SYS |
|-----|-------|--------|-----|
|   1 |  55mm |  rcd30 |   5 | (initial setup sys 5)
|   2 |  80mm |    ph1 |   4 | (initial setup sys 4)
|   3 |  80mm |    ph1 |   4 | (new setup sys 4)
|   4 |  55mm |    ph1 |   5 | (new setup sys 5)
|   5 |  80mm |  rcd30 |   5 | (new setup sys 5)

我想要的是比较两个系统(4和5)是否在同一系统的设置之间发生变化,并创建一个表格,我保留结果,并从每次加载列表时显示它们设置。

例如,如果我比较系统5的设置,比较第1行和第4行,相机会有差异;在4到5之间,相机和镜头都会发生变化。如果将每个系统的第一条记录视为初始设置,则可以正常工作。

CHANGES

| SNR | LENSE | CAMERA | SYS |
|-----|-------|--------|-----|
|   1 |     n |      n |   5 | (initial setup sys 5)
|   2 |     n |      n |   4 | (initial setup sys 4)
|   3 |     n |      n |   4 | (new setup sys 4)
|   4 |     n |      y |   5 | (new setup sys 5)
|   5 |     y |      y |   5 | (new setup sys 5)

是否可以使用SQL执行此操作?任何想法怎么样? SQL从未成为我最强烈的观点:(

编辑:使用SQL Server 2012

1 个答案:

答案 0 :(得分:2)

如果您使用的是SQL Server 2012或更高版本,则可以使用LAG查找以前的值,并使用CASE来判断旧值和新值是否不同;

WITH cte AS (
  SELECT snr, sys,
         lense,  LAG(lense)  OVER (PARTITION BY sys ORDER BY snr) old_lense,
         camera, LAG(camera) OVER (PARTITION BY sys ORDER BY snr) old_camera
  FROM table1
)
SELECT snr, sys,
       CASE WHEN lense  <> old_lense  THEN 'y' ELSE 'n' END lense,
       CASE WHEN camera <> old_camera THEN 'y' ELSE 'n' END camera
FROM cte
ORDER BY snr;

An SQLfiddle to test with