Sql 比较并从同一个表中获取列详细信息

Sql 比较并从同一个表中获取列详细信息,sql,sql-server,sql-server-2012,sql-server-2016,Sql,Sql Server,Sql Server 2012,Sql Server 2016,我需要一些帮助来解决以下问题 表格数据格式 Value | MATERIAL DATE 2949.00 | 000000000430450051 | 03/11/2013 00:00:00 2949.00 | 000000000430450051 | 04/15/2013 00:00:00 2949.00 | 000000000430450051 | 05/13/2013 00:00:00 294

我需要一些帮助来解决以下问题

表格数据格式

Value       |     MATERIAL                DATE 
2949.00     |   000000000430450051 |  03/11/2013 00:00:00 
2949.00     |   000000000430450051 |  04/15/2013 00:00:00 
2949.00     |   000000000430450051 |  05/13/2013 00:00:00 
2949.00     |   000000000430450051 |  06/24/2013 00:00:00 
2949.00     |   000000000430450051 |  09/03/2013 00:00:00 
2949.00     |   000000000430450051 |  10/14/2013 00:00:00 
2949.00     |   000000000430450051 |  11/11/2013 00:00:00 
2949.00     |   000000000430450051 |  12/16/2013 00:00:00 
2949.00     |   000000000430450051 |  02/24/2014 00:00:00 
2425.26     |   000000000430450051 |  04/21/2014 00:00:00 <===
2425.26     |   000000000430450051 |  05/05/2014 00:00:00 
2425.26     |   000000000430450051 |  08/11/2014 00:00:00 
2425.26     |   000000000430450051 |  09/04/2014 00:00:00 
2425.26     |   000000000430450051 |  10/13/2014 00:00:00 
2425.26     |   000000000430450051 |  12/10/2014 00:00:00 
2425.26     |   000000000430450051 |  02/02/2015 00:00:00 
2425.26     |   000000000430450051 |  03/18/2015 00:00:00 
3032.00     |   000000000430450051 |  04/13/2015 00:00:00 <===
3032.00     |   000000000430450051 |  05/26/2015 00:00:00 
3032.00     |   000000000430450051 |  06/15/2015 00:00:00 
3032.00     |   000000000430450051 |  07/20/2015 00:00:00 

您可以使用lag并获得下一个值,然后按如下所示查找更改

select * from (
select *, NextValue = lag(value,1,null) over (order by date) from #yourMaterial
) a
where value <> nextvalue

您可以在“值”和“材质”列上分组,并在select语句中获取最小日期

SELECT Value,
Material,
MIN(Date)
FROM [YourTable]
GROUP BY Value,
Material

这是完整的场景,使用WITH子句以提高可读性:

WITH
-- your input
input(value,material,dt) AS (
          SELECT 2949.00,'000000000430450051',DATE '03/11/2013'
UNION ALL SELECT 2949.00,'000000000430450051',DATE '04/15/2013'
UNION ALL SELECT 2949.00,'000000000430450051',DATE '05/13/2013'
UNION ALL SELECT 2949.00,'000000000430450051',DATE '06/24/2013'
UNION ALL SELECT 2949.00,'000000000430450051',DATE '09/03/2013'
UNION ALL SELECT 2949.00,'000000000430450051',DATE '10/14/2013'
UNION ALL SELECT 2949.00,'000000000430450051',DATE '11/11/2013'
UNION ALL SELECT 2949.00,'000000000430450051',DATE '12/16/2013'
UNION ALL SELECT 2949.00,'000000000430450051',DATE '02/24/2014'
UNION ALL SELECT 2425.26,'000000000430450051',DATE '04/21/2014'
UNION ALL SELECT 2425.26,'000000000430450051',DATE '05/05/2014'
UNION ALL SELECT 2425.26,'000000000430450051',DATE '08/11/2014'
UNION ALL SELECT 2425.26,'000000000430450051',DATE '09/04/2014'
UNION ALL SELECT 2425.26,'000000000430450051',DATE '10/13/2014'
UNION ALL SELECT 2425.26,'000000000430450051',DATE '12/10/2014'
UNION ALL SELECT 2425.26,'000000000430450051',DATE '02/02/2015'
UNION ALL SELECT 2425.26,'000000000430450051',DATE '03/18/2015'
UNION ALL SELECT 3032.00,'000000000430450051',DATE '04/13/2015'
UNION ALL SELECT 3032.00,'000000000430450051',DATE '05/26/2015'
UNION ALL SELECT 3032.00,'000000000430450051',DATE '06/15/2015'
UNION ALL SELECT 3032.00,'000000000430450051',DATE '07/20/2015'
)
-- end of your input, start "real" WITH clause - and your query - here
,
input_w_change_marker AS (
  SELECT
    *
  , value <> LAG(value) OVER(PARTITION BY material ORDER BY dt) AS val_has_changed
  FROM input
)
SELECT
  value
, dt
FROM input_w_change_marker
WHERE val_has_changed
;

value   |dt
2,425.26|2014-04-21
3,032.00|2015-04-13

到目前为止,你做过什么尝试,做过什么研究,有什么想法?我们来这里不是为你工作,而是帮助你自己找到答案。可能会帮助您移除中柱,同时可能会帮助您检查值是否已更改。
SELECT Value,
Material,
MIN(Date)
FROM [YourTable]
GROUP BY Value,
Material
WITH
-- your input
input(value,material,dt) AS (
          SELECT 2949.00,'000000000430450051',DATE '03/11/2013'
UNION ALL SELECT 2949.00,'000000000430450051',DATE '04/15/2013'
UNION ALL SELECT 2949.00,'000000000430450051',DATE '05/13/2013'
UNION ALL SELECT 2949.00,'000000000430450051',DATE '06/24/2013'
UNION ALL SELECT 2949.00,'000000000430450051',DATE '09/03/2013'
UNION ALL SELECT 2949.00,'000000000430450051',DATE '10/14/2013'
UNION ALL SELECT 2949.00,'000000000430450051',DATE '11/11/2013'
UNION ALL SELECT 2949.00,'000000000430450051',DATE '12/16/2013'
UNION ALL SELECT 2949.00,'000000000430450051',DATE '02/24/2014'
UNION ALL SELECT 2425.26,'000000000430450051',DATE '04/21/2014'
UNION ALL SELECT 2425.26,'000000000430450051',DATE '05/05/2014'
UNION ALL SELECT 2425.26,'000000000430450051',DATE '08/11/2014'
UNION ALL SELECT 2425.26,'000000000430450051',DATE '09/04/2014'
UNION ALL SELECT 2425.26,'000000000430450051',DATE '10/13/2014'
UNION ALL SELECT 2425.26,'000000000430450051',DATE '12/10/2014'
UNION ALL SELECT 2425.26,'000000000430450051',DATE '02/02/2015'
UNION ALL SELECT 2425.26,'000000000430450051',DATE '03/18/2015'
UNION ALL SELECT 3032.00,'000000000430450051',DATE '04/13/2015'
UNION ALL SELECT 3032.00,'000000000430450051',DATE '05/26/2015'
UNION ALL SELECT 3032.00,'000000000430450051',DATE '06/15/2015'
UNION ALL SELECT 3032.00,'000000000430450051',DATE '07/20/2015'
)
-- end of your input, start "real" WITH clause - and your query - here
,
input_w_change_marker AS (
  SELECT
    *
  , value <> LAG(value) OVER(PARTITION BY material ORDER BY dt) AS val_has_changed
  FROM input
)
SELECT
  value
, dt
FROM input_w_change_marker
WHERE val_has_changed
;

value   |dt
2,425.26|2014-04-21
3,032.00|2015-04-13