我有一个SQL Server表,如此屏幕截图所示:
如何查询表以获取包含静态值的其他列,例如。 change
和no change
基于GROUP
和VALUE
列?
在上述情况下,我需要no change
作为GROUP
= 1的值,因为GROUP和VALUE都相同,但GROUP = 2的change
作为GROUP的VALUE列中的值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