AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 250573
Accepted
SQLserving
SQLserving
Asked: 2019-10-09 09:37:18 +0800 CST2019-10-09 09:37:18 +0800 CST 2019-10-09 09:37:18 +0800 CST

Limites de milhas divididos ao milésimo com base no ID

  • 772

Eu tenho uma tabela assim no sql server 2014:

ID | Start_mile|End_mile  
1  |5.23       |7.464  
2  |2.333      |6.124 

O que eu quero fazer é dividir as milhas em milésimos por ID assim:

ID |start_mile|end_mile  
1  |5.230     |5.231  
1  |5.231     |5.232  
1  |5.232     |5.233  
....  
1  |7.463     |7.464  
...

Alguma ideia de como fazer isso? Estou tentando ficar longe dos cursores, a menos que essa seja a única maneira de fazer isso.

Consegui reunir essa consulta, mas não tenho certeza de como incorporá-la ao ID e aos limites de milhas que tenho para que ela seja executada em toda a tabela sem as variáveis ​​De e Para declaradas:

DECLARE @from decimal(15, 3) = 0.980;  
DECLARE @to decimal(15, 3) = 1.024;  

;WITH cte AS  
    (SELECT @from AS Value  
     UNION ALL  
     SELECT CONVERT(decimal(15, 3), Value + 0.001)  
     FROM cte  
     WHERE Value < @to)  
SELECT *  
FROM cte  
option (maxrecursion 0) 
sql-server
  • 3 3 respostas
  • 376 Views

3 respostas

  • Voted
  1. Randi Vertongen
    2019-10-09T10:30:55+08:002019-10-09T10:30:55+08:00

    Se você não quiser usar um CTE recursivo, use o exemplo de consulta abaixo:

    SELECT m.ID, 
           a.rn as start_mile, 
           a.rn+ CONVERT(decimal(15, 3),0.001) as end_mile
    FROM dbo.Miles m
    CROSS APPLY
    (
        SELECT TOP(CONVERT(int,(( end_mile -  Start_mile)* 1000)))
        CONVERT(decimal(15, 3),(Start_mile + (CONVERT(decimal(15, 3),ROW_NUMBER() OVER(ORDER BY (SELECT NULL))-1) / 1000))) as rn
        FROM master..spt_values spt1
        CROSS APPLY master..spt_values spt2
    ) as a;
    

    Isso deve funcionar até 6 milhões de milhas para um id.

    A tabela de valores spt pode ser substituída por uma tabela de números de algum tipo.

    DB<>Fiddle

    • 5
  2. Best Answer
    MattyZDBA
    2019-10-09T10:11:44+08:002019-10-09T10:11:44+08:00

    Você só precisa referenciar os valores iniciais e finais na âncora.

    CREATE TABLE #tmp (
        ID INT NOT NULL PRIMARY KEY
        ,[Start] DECIMAL(15, 3)
        ,[To] DECIMAL(15, 3)
        )
    GO
    INSERT INTO #tmp (
        ID
        ,[Start]
        ,[To]
        )
    VALUES (
        1
        ,5.00
        ,5.99
        )
        ,(
        2
        ,10.00
        ,10.4
        );
    WITH cte
    AS (
        SELECT ID
            ,[Start]
            ,[To]
            ,CAST([Start] AS DECIMAL(15, 3)) AS [Value]
        FROM #tmp
    
        UNION ALL
    
        SELECT ID
            ,[Start]
            ,[To]
            ,CAST(([Value] + 0.001) AS DECIMAL(15, 3))
        FROM cte
        WHERE CAST(([Value] + 0.001) AS DECIMAL(15, 3)) < [To]
        )
    SELECT *
    FROM cte
    ORDER BY ID
        ,Start
        ,Value
    OPTION (MAXRECURSION 0)
    
    • 4
  3. Laughing Vergil
    2019-10-09T10:28:32+08:002019-10-09T10:28:32+08:00

    Esta é uma maneira de fazê-lo. Esta é apenas uma maneira. Existem várias outras maneiras de fazer isso, e todas as maneiras envolvem alguns loops e compensações, mas uma vez que essa maneira é preparada, nenhum outro loop é necessário.

    CREATE TABLE #Intervals (
        i decimal(7,3) not null primary key
        )
    
    INSERT INTO #Intervals Values (0.001), (0.002), (0.003), (0.004), (0.005), (0.006),
        (0.007), (0.008), (0.009), (0.01), (0.011), (0.012), (0.013), (0.014), (0.015), (0.016)
    
    DECLARE @ct int = 18        -- Up to 4100 miles. Reduce iterations if you don't need this much.
    DECLARE @mx decimal(7,3)
    
    SELECT @mx = Max(i) from #Intervals
    
    WHILE @ct > 0    -- loop for loading the #Intervals table
    BEGIN
        INSERT INTO #Intervals SELECT i + @mx FROM #intervals
        SELECT @mx = Max(i) from #Intervals
        SET @ct -=1
    END
    
    INSERT INTO #Intervals Values(0.000)    -- just in case milepost zero
    
    CREATE TABLE #miles (
        ID int not null,
        Start_Mile decimal(7,3) Not Null,
        End_Mile decimal(7,3) Not Null
        )
    
    CREATE TABLE #NewMiles (
        ID int not null,
        Start_Mile decimal(7,3) Not Null,
        End_Mile decimal(7,3) Not Null
        )
    
    INSERT INTO #miles Values
        (1, 5.23, 7.464),
        (2, 2.333, 6.124)
    
    INSERT INTO #NewMiles
    SELECT m.id, i.i, i.i + 0.001
    FROM #miles m
    INNER JOIN #Intervals i
        ON i.i >= m.Start_Mile and i.i < m.End_Mile
    
    SELECT *
    FROM #NewMiles
    ORDER BY id, Start_Mile
    
    
    DROP TABLE #Intervals
    DROP TABLE #miles
    DROP TABLE #NewMiles
    

    Outros métodos possíveis incluem uma tabela de números verdadeiros (valores de 0 a qualquer um) com cálculos adicionais para determinar o corte superior, uma versão do seu CTE incorporado em uma função com valor de tabela como esta:

    CREATE FUNCTION dbo.GetMileThousandths (
        @ID int,
        @from decimal(7, 3),
        @to decimal(7, 3)
    )
    RETURNS TABLE
    AS
    RETURN (
        WITH cte AS (
            SELECT @id as id, 
                @from AS Value  
            UNION ALL  
            SELECT id, 
                Cast(Value + 0.001 as decimal(7,3))
            FROM cte  
            WHERE Value < @to
            )
        SELECT *
        FROM cte
        )
    GO
    
    SELECT id, Value, Value+0.001
    FROM dbo.GetMileThousandths(1, 1.111, 2.222)
        OPTION (maxRecursion 0)
    

    e muitos outros

    • 3

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve