unir tablas subconsultas solo registros funciones ejemplos consultas agrupamiento agrupadas sql sql-server result-partitioning

tablas - unir dos registros en un solo sql



¿Hay alguna manera de dividir los resultados de una consulta de selección en dos partes iguales? (6)

Necesito una solución para una consulta de selección en Sql Server 2005.

Me gustaría tener una consulta que devuelva dos ResultSets, cada uno de los cuales contenga exactamente la mitad de todos los registros que cumplan ciertos criterios. Intenté usar TOP 50 PERCENT junto con un pedido por, pero si el número de registros en la tabla es impar, un registro aparecerá en ambos conjuntos de resultados. No quiero tener ningún registro duplicado en los conjuntos de registros. Ejemplo:

Tengo una tabla simple con los campos TheID (PK) y TheValue (varchar (10)) y 5 registros. Salta la cláusula where por ahora.

SELECT TOP 50 PERCENT * FROM TheTable ORDER BY TheID asc

resultados en el id seleccionado 1,2,3

SELECT TOP 50 PERCENT * FROM TheTable ORDER BY TheID desc

resultados en la identificación seleccionada de 3,4,5

3 es un dup. En la vida real, por supuesto, las consultas son bastante complicadas con un montón de cláusulas y subconsultas.


Aquí hay otra solución:

Necesitaría usar una tabla temporal para mantener el primer 50% de la siguiente manera:

select top 50 percent * into #YourTempTable from TheTable -- The below would give the first half select * from #YourTempTable -- The below woud give rest of the half select * from TheTable where TheID not in (select TheID from #YourTempTable)


Esta es la consulta que encontré útil (después de las modificaciones del curso):

DECLARE @numberofitemsperpage INT DECLARE @numberofpages INT DECLARE @currentpage int

DECLARE @countRecords float SET @countRecords = (Seleccione COUNT (*) From sz_hold_visitsData): Excel puede almacenar aproximadamente UN MILLÓN de registros a la vez. if @countRecords> = 1000000 SET @numberofitemsperpage = 500000 ELSE IF @countRecords <1000000 AND @countRecords> = 500000 SET @numberofitemsperpage = 250000 ELElp.p.P.P. 10000

DECLARAR @numberofpages_deci float SET @numberofpages_deci = @countRecords / @numberofitemsperpage

SET @numberofpages = CEILING (@numberofpages_deci) Seleccione @countRecords AS countRecords, @numberofitemsperpage AS numberofitemsperpage, @numberofpages_deci AS numberofpages_deci, @numberofpages AS numberofpagesFnl

SET @currentpage = 0 WHILE @currentpage <@numberofpages BEGIN SELECT a. * FROM (SELECT row_number () OVER (ORDEN POR person_ID) COMO ROW, * FROM sz_hold_visitsData) a WHERE ROW> = @currentpage * @numberofitemsperpage +1 AND Row < = (@ currentpage + 1) * @numberofitemsperpage

IF @@ ROWCOUNT = 0 BREAK SET @currentpage = @currentpage +1 END

En este extracto, "sz_hold_visitsData" es una tabla en mi base de datos, mientras que "person_ID" es una columna en ella. También puede modificar más la secuencia de comandos para generar un archivo:

DECLARE @numberofitemsperpage INT DECLARE @numberofpages INT DECLARE @currentpage int

DECLARE @countRecords float SET @countRecords = (Seleccione COUNT (*) From sz_hold_visitsData): Excel puede almacenar aproximadamente UN MILLÓN de registros a la vez. if @countRecords> = 1000000 SET @numberofitemsperpage = 500000 ELSE IF @countRecords <1000000 AND @countRecords> = 500000 SET @numberofitemsperpage = 250000 ELElp.p.P.P. 10000

DECLARAR @numberofpages_deci float SET @numberofpages_deci = @countRecords / @numberofitemsperpage

SET @numberofpages = CEILING (@numberofpages_deci) Seleccione @countRecords AS countRecords, @numberofitemsperpage AS numberofitemsperpage, @numberofpages_deci AS numberofpages_deci, @numberofpages AS numberofpagesFnl

DECLARAR @sevrName nvarchar (50) SET @sevrName = ''. / Sql14'' DECLARAR @outputFile nvarchar (500)

SET @currentpage = 0 WHILE @currentpage <@numberofpages COMIENZO - SELECCIONE un. * FROM (SELECCIONE el número de fila () OVER (ORDEN POR person_ID) COMO ROW, * FROM sz_hold_visitsData) a WHERE ROW> = @currentpage * @numberofitemsperpage +1 And Fila <= (@ currentpage + 1) * @numberofitemsperpage SET @outputFile = ''C: / PSM / outVisits_'' + convert (nvarchar (50), @currentpage) + ''.csv'' --Selecciona @outputFile --TEST

DECLARAR @cmd_ varchar (500) = ''sqlcmd -S'' + @sevrName + ''-E -Q "SELECCIONE a. * FROM (SELECCIONE el número de fila () OVER (ORDER BY person_ID) COMO ROW, * FROM sz_hold_visitsData) a WHERE ROW> = ''+ CONVERTIR (nvarchar (500), @ currentpage * @numberofitemsperpage +1) +'' AND Fila <= ''+ CONVERT (nvarchar (500), ((@ currentpage + 1) * @numberofitemsperpage)) +'' "-s "," -o ''+ @ outputFile +'' ''- "C: / PSM / outVisits.csv"'' EXEC xp_cmdshell @cmd_

IF @@ ROWCOUNT = 0 BREAK SET @currentpage = @currentpage +1 END

La esperanza ayuda.


Podrías usar estas dos consultas:

SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (ORDER BY TheID) AS rn FROM TheTable ) T1 WHERE rn % 2 = 0 SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (ORDER BY TheID) AS rn FROM TheTable ) T1 WHERE rn % 2 = 1


SQL Server 2005 y similares:

select *, ntile(2) over(order by theid) as tile_nr from thetable

ntile(n) asigna la salida en n segmentos, cada uno del mismo tamaño (dar o tomar redondeo cuando el número de filas no es divisible por n). Así que esto produce la salida:

1 | value1 | 1 2 | value2 | 1 3 | value3 | 1 4 | value4 | 2 5 | value5 | 2

Si solo desea la mitad superior o inferior, debe poner esto en una subconsulta, por ejemplo:

select theid, thevalue from ( select theid, thevalue, ntile(2) over(order by theid) as tile_nr from thetable ) x where x.tile_nr = 1

devolverá la mitad superior y, de manera similar, use x.tile_nr = 2 para la mitad inferior


Si este es SQL Server 2000, entonces me gustaría encontrar el PK del valor medio así:

Declare @MiddleId int Set @MiddleId = ( Select TOP 1 PK From ( Select TOP 50 PERCENT PK From Table Order By TheId ASC ) Order By TheId DESC ) Select ... From Table Where TheId <= @MiddleId Select .. From Table Where TheId > @MiddleId

Con SQL Server 2005, me inclino a hacer lo mismo pero puede usar un CTE

;With NumProjects As ( Select Id, ROW_NUMBER() OVER (ORDER BY TheId ASC ) As Num From Table ) Select @MiddleId = Id From Table Where Num = CEILING( (Select Count(*) From Table) / 2 )


prueba esto:

DECLARE @CountOf int,@Top int,@Bottom int SELECT @CountOf=COUNT(*) FROM YourTable SET @Top=@CountOf/2 SET @Bottom=@CountOf-@Top SELECT TOP (@Top) * FROM YourTable ORDER BY 1 asc --assumes column 1 is your PK SELECT TOP (@Bottom) * FROM YourTable ORDER BY 1 desc --assumes column 1 is your PK