SQL查询以基于组获取结果

时间:2015-10-06 05:00:02

标签: sql sql-server-2008

我有一个SQL Server表,如此屏幕截图所示:

enter image description here

如何查询表以获取包含静态值的其他列,例如。 changeno change基于GROUPVALUE列?

在上述情况下,我需要no change作为GROUP = 1的值,因为GROUP和VALUE都相同,但GROUP = 2的change作为GROUP的VALUE列中的值2是不同的。

2 个答案:

答案 0 :(得分:1)

这是一个应该涵盖用例的查询:

SELECT t1.GROUP, t1.ROW_NUM, t1.VALUE, t2.CHANGE
FROM table t1 INNER JOIN
(
    SELECT GROUP,
        CASE WHEN COUNT(DISTINCT VALUE) = 1 THEN 'change'
        ELSE 'no change' END AS CHANGE
    FROM table
    GROUP BY GROUP
) t2
ON t1.GROUP = t2.GROUP

顺便说一下,你可能会遇到语法错误,因为你以某种方式设法调用你的列“GROUP”,它是大多数SQL中的保留关键字。

答案 1 :(得分:1)

SELECT [GROUP],
    ROW_NUM,
    CASE 
       WHEN [GROUP]=1 AND CHANGE=VALUE  THEN 'no change'
       WHEN [GROUP]=2 AND CHANGE!=VALUE THEN 'change'
       ELSE '' 
    END AS VALUE
FROM table
GROUP BY [GROUP]

你的问题有点不清楚,因为我最初认为你想要比较两个领域。但也许,您正在尝试比较结果集中的两个记录;当前记录到前一个记录并且只想要“不变”'当两个列在记录之间没有变化时。

要比较记录,您可以使用窗口函数lag,它可以访问窗口中前一行的值。有关该页面的说明,请参见下文:

  

适用于:SQL Server 2014,SQL Server 2016预览

     

访问同一结果集中前一行的数据,而不使用SQL Server 2016中的自联接.LAG提供对当前行之前的给定物理偏移量的行的访问。在SELECT语句中使用此分析函数将当前行中的值与前一行中的值进行比较。

SELECT [GROUP],
    ROW_NUM,
    VALUE,
    CASE 
       WHEN [GROUP] = LAG([GROUP],1,0) OVER(ORDER BY [GROUP],VALUE)
          THEN CASE 
             WHEN VALUE = LAG(VALUE,1,0) OVER(ORDER BY [GROUP],VALUE) 
             THEN 'no change'
             ELSE 'change'
          END
       ELSE ''
    END AS CHANGE
FROM table
ORDER BY [GROUP], ROW_NUM