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