Sql server 基于早期结果获取Sql集中的下一个关联记录结果

Sql server 基于早期结果获取Sql集中的下一个关联记录结果,sql-server,Sql Server,早上好 我被要求做一份关于轮胎更换和车辆检查的报告 我把不同的部分贴在柱子的底部 但我基本上要做的是找出一个轮胎在资产上的特定位置有多长时间,以及它被安装的时间与另一个轮胎被替换的时间之间的差异等等 我甚至不知道从哪里开始这个查询,因为我对sql server一般都是新手 我的sql表是 CREATE TABLE assets_tyre_change_header ( id INT NOT NULL IDENTITY(1,1), change_date date not null,

早上好

我被要求做一份关于轮胎更换和车辆检查的报告

我把不同的部分贴在柱子的底部

但我基本上要做的是找出一个轮胎在资产上的特定位置有多长时间,以及它被安装的时间与另一个轮胎被替换的时间之间的差异等等

我甚至不知道从哪里开始这个查询,因为我对sql server一般都是新手

我的sql表是

    CREATE TABLE assets_tyre_change_header
( id INT NOT NULL IDENTITY(1,1),
  change_date date not null,
  asset_id varchar(50) not null,
  odometer_hour varchar(50),
  completed tinyint,
  comment text,
  CONSTRAINT assets_tyre_change_pk PRIMARY KEY (id)
);

CREATE TABLE assets_tyre_change_details
( id INT NOT NULL IDENTITY(1,1),
  tyre_change_id INT,
  tyre_id varchar(50) not null,
  wheel_position varchar(50) not null,
  tread_depth int not null,
  minimum_depth int not null
  CONSTRAINT assets_tyre_change_detail_pk PRIMARY KEY (id)
);

create table assets_tyre_inspection_header
( id INT NOT NULL IDENTITY(1,1),
  inspection_date date not null,
  asset_id varchar(50) not null,
  odometer_hour varchar(50),
  completed tinyint,
  comment text,
  CONSTRAINT assets_tyre_inspection_pk PRIMARY KEY (id)
);

CREATE TABLE assets_tyre_inspection_details
( id INT NOT NULL IDENTITY(1,1),
  tyre_inspection_id INT,
  tyre_id varchar(50) not null,
  wheel_position varchar(50) not null,
  tread_depth int not null
  CONSTRAINT assets_tyre_inspection_detail_pk PRIMARY KEY (id)
);
我的下一步是从这些表中提取基本细节作为结果表

sql附加

select * from (
(select 'change' as type,
    tyre_id,
    asset_id,
    wheel_position,
    min(convert(int,odometer_hour))as min_oh,
    max(convert(int,odometer_hour))as max_oh,
    min(tread_depth)as min_depth,
    min(change_date) as transdate 
    from assetsandfuel.dbo.assets_tyre_change_details as c_details
    join assetsandfuel.dbo.assets_tyre_change_header as c_header on c_header.id = c_details.tyre_change_id
    group by asset_id,tyre_id,wheel_position
)
union
(select 'inspect' as type,
tyre_id,
asset_id,
wheel_position,
min(convert(int,odometer_hour))as min_oh,
max(convert(int,odometer_hour))as max_oh,
min(tread_depth)as min_depth,
min(inspection_date) as transdate 
from assetsandfuel.dbo.assets_tyre_inspection_details as i_details
join assetsandfuel.dbo.assets_tyre_inspection_header as i_header on i_header.id = i_details.tyre_inspection_id
group by asset_id,tyre_id,wheel_position
)
)as report_table
order by transdate;
这将导致以下记录作为表格结果交付

type    tyre    asset           position    min max    depth    transdate
change  T001    TestV            4         1489 1489    15     2016-04-01
change  T002    TestV            6         1489 1489    15     2016-04-01
change  F146    Forklift001      3         6900 6900    30     2016-04-02
change  F147    Forklift001      2         6900 6900    30     2016-04-02
change  T001    TestV            6         2800 2800    12     2016-04-08
change  T002    TestV            4         2800 2800    10     2016-04-08
change  T003    TestV            12        2800 2800    15     2016-04-08
inspect F146    Forklift001      3         6920 6920    27     2016-04-09
inspect F147    Forklift001      2         6920 6920    15     2016-04-09
inspect T001    TestV            6         3400 3400    9      2016-04-10
inspect T003    TestV            12        3400 3400    12     2016-04-10
change  F148    Forklift001      1         6950 6950    30     2016-04-11
change  F149    Forklift001      4         6950 6950    30     2016-04-11

非常感谢。我正在尝试编辑它以插入我的检查表。但到目前为止,前景看好。我会让你知道结果的
/*  Using set up below
    Generate a row number to sequence tyre changes and then join each row to the next row*/
SELECT  TC1.Type, tc1.tyre_id as Tyre, tc1.asset_id as Asset, tc1.wheel_position as Position, 
        tc1.MINOH as 'Min', tc2.oh as 'Max', cast(tc2.oh as int) - cast(tc1.minoh as int) as 'Time in Wheel Position',
        tc1.tread_depth, tc1.trandate
FROM 
(
SELECT  'Change'  as Type,TH.id AS THID, TH.change_date TRANDATE,TH.asset_id,TH.odometer_hour MINOH,TH.completed,TH.comment, 
        TD.id AS TDID, TD.tyre_change_id,TD.tyre_id,TD.wheel_position,TD.tread_depth,TD.minimum_depth
        ,ROW_NUMBER() OVER(PARTITION BY TH.ASSET_ID ORDER BY TD.TYRE_ID ,TH.ID) AS ROWNUMBER
FROM [dbo].[assets_tyre_change_header] TH
JOIN     [dbo].[assets_tyre_change_details] TD ON TD.TYRE_CHANGE_ID = TH.ID
) TC1
LEFT JOIN 
(
SELECT  'Change' as Type , TH.id AS THID, TH.change_date TRANDATE,TH.asset_id,TH.odometer_hour OH,TH.completed,TH.comment, 
        TD.id AS TDID, TD.tyre_change_id,TD.tyre_id,TD.wheel_position,TD.tread_depth,TD.minimum_depth
        ,ROW_NUMBER() OVER(PARTITION BY TH.ASSET_ID ORDER BY TD.TYRE_ID ,TH.ID) AS ROWNUMBER
FROM [dbo].[assets_tyre_change_header] TH
JOIN     [dbo].[assets_tyre_change_details] TD ON TD.TYRE_CHANGE_ID = TH.ID
) TC2 
ON TC2.ASSET_ID = TC1.ASSET_ID AND TC2.tyre_id = TC1.TYRE_ID AND TC2.ROWNUMBER = TC1.ROWNUMBER + 1 



/*
Create Tables

DROP TABLE [dbo].[assets_tyre_change_header]
GO


SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[assets_tyre_change_header](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [change_date] [date] NOT NULL,
    [asset_id] [varchar](50) NOT NULL,
    [odometer_hour] [varchar](50) NULL,
    [completed] [tinyint] NULL,
    [comment] [text] NULL,
 CONSTRAINT [assets_tyre_change_pk] PRIMARY KEY CLUSTERED 
(
    [id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

USE [Sandbox]
GO

DROP TABLE [dbo].[assets_tyre_change_details]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[assets_tyre_change_details](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [tyre_change_id] [int] NULL,
    [tyre_id] [varchar](50) NOT NULL,
    [wheel_position] [varchar](50) NOT NULL,
    [tread_depth] [int] NOT NULL,
    [minimum_depth] [int] NOT NULL,
 CONSTRAINT [assets_tyre_change_detail_pk] PRIMARY KEY CLUSTERED 
(
    [id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

USE [Sandbox]
GO

DROP TABLE [dbo].[assets_tyre_inspection_header]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[assets_tyre_inspection_header](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [inspection_date] [date] NOT NULL,
    [asset_id] [varchar](50) NOT NULL,
    [odometer_hour] [varchar](50) NULL,
    [completed] [tinyint] NULL,
    [comment] [text] NULL,
 CONSTRAINT [assets_tyre_inspection_pk] PRIMARY KEY CLUSTERED 
(
    [id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO


USE [Sandbox]
GO

DROP TABLE [dbo].[assets_tyre_inspection_details]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[assets_tyre_inspection_details](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [tyre_inspection_id] [int] NULL,
    [tyre_id] [varchar](50) NOT NULL,
    [wheel_position] [varchar](50) NOT NULL,
    [tread_depth] [int] NOT NULL,
 CONSTRAINT [assets_tyre_inspection_detail_pk] PRIMARY KEY CLUSTERED 
(
    [id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

---------------
Populate Tables
---------------

insert into assets_tyre_change_header
( --id ,
  change_date ,
  asset_id    ,
  odometer_hour
  --completed ,
  --comment 
)
values 
(cast('2016/04/01' as smalldatetime),'TestV',1489),
(cast('2016/04/01' as smalldatetime),'TestV',1489),
(cast('2016/04/02' as smalldatetime),'Forklift001',6900),
(cast('2016/04/02' as smalldatetime),'Forklift001',6900),
(cast('2016/04/08' as smalldatetime),'TestV',2800),
(cast('2016/04/08' as smalldatetime),'TestV',2800),
(cast('2016/04/08' as smalldatetime),'TestV',2800),
(cast('2016/04/11' as smalldatetime),'Forklift001',6950),
(cast('2016/04/11' as smalldatetime),'Forklift001',6950)

insert into  assets_tyre_change_details
( --id ,
  tyre_change_id ,
  tyre_id ,
  wheel_position ,
  tread_depth ,
  minimum_depth 
)
values 
(1,'T001',4,15,5),
(2,'T002',6,15,5),
(3,'F146',3,30,5),
(4,'F147',2,30,5),
(5,'T001',6,12,5),
(6,'T002',4,10,5),
(7,'T003',12,15,5),
(8,'F148',1,1,5),
(9,'F149',4,4,5)

insert into assets_tyre_inspection_header
( --id ,
  inspection_date ,
  asset_id    ,
  odometer_hour
  --completed ,
  --comment 
)
values 
(cast('2016/04/09' as smalldatetime),'Forklift001',6920),
(cast('2016/04/09' as smalldatetime),'Forklift001',6920),
(cast('2016/04/10' as smalldatetime),'TestV',3400),
(cast('2016/04/10' as smalldatetime),'TestV',3400)

insert into  assets_tyre_inspection_details
( --id ,
  tyre_inspection_id ,
  tyre_id ,
  wheel_position ,
  tread_depth --,
  --tread_depth 
)
values 
(1,'F146',3,27),
(2,'F147',2,15),
(3,'T001',6,9),
(4,'T002',12,12)


*/