Sql server 2008 使用MAX函数的内部连接-SQLSERVER-
我一直在寻找解决问题的办法,但我相信我做错了什么 我需要在表中选择一行,这一行有一个名为“SEQ”的列,其值从0到200 10-10。在结果中,具有最大顺序字段但小于第一个选定字段的行 例如:Sql server 2008 使用MAX函数的内部连接-SQLSERVER-,sql-server-2008,max,inner-join,Sql Server 2008,Max,Inner Join,我一直在寻找解决问题的办法,但我相信我做错了什么 我需要在表中选择一行,这一行有一个名为“SEQ”的列,其值从0到200 10-10。在结果中,具有最大顺序字段但小于第一个选定字段的行 例如: +----------------------------+ | cod cod_os task seq | +----------------------------+ | 1 9000 wash 10 | | 2 9000 dry 20
+----------------------------+
| cod cod_os task seq |
+----------------------------+
| 1 9000 wash 10 |
| 2 9000 dry 20 |
| 3 9000 polish 40 |
| 4 9003 **** 10 |
| 5 9000 park 80 |
| 6 9003 **** 20 |
| 7 9020 **** 10 |
| 8 9007 **** 10 |
| 9 9010 **** 10 |
| 10 9009 **** 10 |
| 11 9003 **** 30 |
| 12 9001 **** 10 |
| 13 9002 **** 10 |
| 14 9003 **** 40 |
| 15 9001 **** 20 |
+----------------------------+
预期结果:
Obs:当任务少于他们的“操作系统”时,结果应该是任务本身。“wash”越早是“wach”
+------------------------------------+
| cod cod_os task seq prev |
+------------------------------------+
| 1 9000 wash 10 1 |
| 2 9000 dry 20 1 |
| 3 9000 polish 40 2 |
| 4 9003 **** 10 4 |
| 5 9000 park 80 3 |
| 6 9003 **** 20 4 |
| 7 9020 **** 10 7 |
| 8 9007 **** 10 8 |
| 9 9010 **** 10 9 |
| 10 9009 **** 10 10 |
| 11 9003 **** 30 6 |
| 12 9001 **** 10 12 |
| 13 9002 **** 10 13 |
| 14 9003 **** 40 11 |
| 15 9001 **** 20 12 |
+------------------------------------+
以我的代码SQL SERVER 2008为例:
select
CAST(T0.COD_OS AS VARCHAR) +'/'+ RIGHT(('000' + CAST(T0.COD_OS_AUX AS VARCHAR)),3) 'OS_COMPLETO',
T1.TIPO 'TIPOSERVICO',
T2.NOME 'MAQUINA',
T3.SUBTITULO 'SUB',
T4.CLIENTE 'CLIENTE',
T3.QTDE_PECAS 'QTD',
t0.CODIGO 'COD',
t0.SEQ 'SEQ',
t0.OBS 'OBS',
t0.DT_INCIO_PREVISTO 'INICIO',
t0.DT_TERMINO_PREVISTO 'FIM',
t0.TOTAL_HRS_TIME 'TOTAL',
T4.CANCELADO,
T4.CONCLUIDO,
T5.SEQ 'ANTERIOR',
(CASE WHEN T1.TIPO <> T6.TIPO THEN T6.TIPO ELSE 'REQ. MATERIAIS' END) 'ANTERIOR'
from [ProjectOne].[dbo].[TPRO_PRO] T0
INNER JOIN [ProjectOne].[dbo].[TTP_MAQU] T1 ON T0.COD_TP_SERVICO=T1.CODIGO
INNER JOIN [ProjectOne].[dbo].[TMAQUINA] T2 ON T0.COD_MAQUINA=T2.CODIGO
INNER JOIN [ProjectOne].[dbo].[TOS_AUX] T3 ON T0.COD_OS=T3.COD_OS AND T0.COD_OS_AUX=T3.CODIGO
INNER JOIN [ProjectOne].[dbo].[TPRO_PRO] T5 ON T5.COD_OS = T0.COD_OS AND T5.COD_OS_AUX = T0.COD_OS_AUX AND T0.SEQ > t5.SEQ
INNER JOIN [ProjectOne].[dbo].[TTP_MAQU] T6 ON T5.COD_TP_SERVICO=T6.CODIGO
INNER JOIN
(
SELECT T0.CODIGO,T0.CANCELADO,T0.CONCLUIDO, T1.NOME AS CLIENTE
FROM [ProjectOne].[dbo].[TOS] T0 INNER JOIN [ProjectOne].[dbo].[TCLIENTE] T1 ON T0.COD_CLIENTE=T1.CODIGO
) T4 ON T4.CODIGO=T0.COD_OS AND T4.CANCELADO=0 AND T4.CONCLUIDO=0 and T0.FINALIZADO=0 and T3.COD_STAUS not in (3,4)
WHERE T0.DT_INCIO_PREVISTO <> ''
ORDER BY T1.TIPO, t0.DT_TERMINO_PREVISTO, t0.COD_OS, T0.COD_OS_AUX
不知道这是否是你想要的, 但考虑到你例子中的表格, 如果您在同一个代码上将其自身连接起来,并在SEQ值上添加条件,使其比所选行低,那么选择最上面的行不就是您所需要的吗
CREATE TABLE [dbo].[TestSEQ](
[cod] [int] NULL,
[cod_os] [int] NULL,
[task] [varchar](50) NULL,
[seq] [int] NULL
) ON [PRIMARY]
INSERT INTO [dbo].[TestSEQ]
([cod]
,[cod_os]
,[task]
,[seq])
VALUES
(1,9000,'wash',10),
(2,9000,'dry',20),
(3,9000,'polish',40),
(4,9003,'****',10),
(5,9000,'park',80),
(6,9003,'****',20),
(7,9020,'****',10),
(8,9007,'****',10),
(9,9010,'****',10),
(10,9009,'****',10),
(11,9003,'****',30),
(12,9001,'****',10),
(13,9002,'****',10),
(14,9003,'****',40),
(15,9001,'****',20)
GO
declare @task varchar(50) = 'park'
SELECT top 1 b.*
FROM [TestSEQ] a
inner join [TestSEQ] b
on a.cod_os = b.cod_os
where 1=1
and a.cod_os = 9000
and a.task = @task
and b.seq < a.seq
order by b.seq desc
对于所有行:
SELECT *
FROM
(
SELECT a.* , max(b.seq) NextSEQAfterMax
FROM [TestSEQ] a
inner join [TestSEQ] b
on a.cod_os = b.cod_os
where 1=1
and b.seq < a.seq
group by a.cod , a.cod_os , a.task , a.seq
) a
inner join TestSEQ b
on a.cod_os = b.cod_os
and a.NextSEQAfterMax = b.seq
您要求该行包含SEQ的最大值,但也要小于您从第一个查询中得到的值。这似乎是一个矛盾,因为它不能同时满足这两个条件。您的意思是它应该返回一行,其中SEQ值是小于第一个SEQ的值中最大的一个?另外,如果它可以从第二个查询返回几个元组,您希望它如何反应?我有一个“作业”序列,当我选择一个“作业”时,它由这个“SEQ”字段组织,我知道前面的“作业”。问题是,上一个50岁的工作并不总是40岁,例如,如果删除了一个,那么它可能是30岁或20岁。当“工作”是第一个,因此具有最低的“序号”时,您希望返回相同的任务副本,或者不返回。我的意思是,在您的示例中,Leandro和Julio以及Jonas和Maria都具有序号20。如果它们应该是第二个查询的返回,那么应该如何处理结果,因为返回了两个或更多可能的值。根据上面的代码,我的结果是几个重复的“作业”,向它显示所有以前的“作业”。例如,当我有“jobs”40时,他向我展示了40,30是最后一个,40,20是前面,40,10是前面。你的代码可以作为解决我问题的开始。但他的问题是,我并不是只选择一行,我必须选择所有处于某种状态的人,以及他们以前的任务。使用您的代码,我只得到一个结果行。检查您调整代码的方式,您的示例中没有50行,因此我无法验证您的注释,但请注意,join语句仅在第二个表中的seq较低时连接行,以排除相等的情况。祝你好运,希望你能成功。我用你的解决方案解决了我的问题。谢谢你的帮助。很高兴能帮上忙,如果对你有帮助,请记下答案,祝你好运。