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 / coding / 问题

Perguntas[sql](coding)

Martin Hope
Johnny Bones
Asked: 2025-04-29 02:03:03 +0800 CST

Comparação eficiente de colunas DATE e DATETIME em uma consulta SQL

  • 5

Tenho tabelas com milhões (possivelmente bilhões) de linhas, então realmente preciso ser eficiente com a consulta.

Nesta consulta, estou unindo várias tabelas. O segmento em questão é:

LEFT JOIN 
    dbo.GCSOCTPS dbo_GCSOCTPS ON (GC_TBMED.MED_CLASS_NUM = dbo_GCSOCTPS.CLASS_NUM) 
                              AND (GC_TBMED.MED_SOC_NUM = dbo_GCSOCTPS.SOC_NUM)
                              AND (GC_TBMED.MED_EFF_DATE = dbo_GCSOCTPS.EFF_DATE)
                              AND (GC_TBMED.MED_CANC_DATE = dbo_GCSOCTPS.CANC_DATE)) 

GC_TBMEDtem datas no DATEformato, dbo_GCSOCTPStem datas no DATETIMEformato. Infelizmente, devido à forma como nossa empresa usa dados, não posso alterar isso.

Qual seria a maneira mais eficiente de comparar essas colunas? CAST? CONVERT? Já vi pessoas convertendo para o formato de texto e comparando dessa forma. Espero que alguém possa me orientar com base em sua experiência com conjuntos de dados muito grandes.

Se eu executar este bloco de código, obtenho um valor para HDHPQ:

SELECT TOP 200 
    HDHPQ,
    SOC_NUM, 
    EFF_DATE,
    CLASS_NUM,
    CANC_DATE
FROM
    dbo.GCSOCTPS
WHERE
    SOC_NUM = '25521'
    AND CLASS_NUM = '37'
    AND CANC_DATE IS NULL;

Isto é retornado:

HDHPQ    SOC_NUM    EFF_DATE                  CLASS_NUM    CANC_DATE 
N         25521    2025-01-01 00:00:00.000      37         NULL

Se eu executar esse bloco de código, também receberei dados retornados:

SELECT TOP 200 
    MED_SOC_NUM,
    MED_EFF_DATE,
    MED_CLASS_NUM,
    MED_CANC_DATE
FROM
    [dbo].[AS_tblTBMED] GC_TBMED
WHERE 
    GC_TBMED.MED_SOC_NUM = '25521'
    AND GC_TBMED.MED_CLASS_NUM = '37'
    AND GC_TBMED.MED_CANC_DATE IS NULL;

Isso é retornado:

MED_SOC_NUM    MED_EFF_DATE    MED_CLASS_NUM    MED_CANC_DATE
25521        2025-01-01        37                NULL

Cada um deles retorna uma linha. Preciso juntá-los para obter todos os dados da segunda consulta e o valor de HDHPQ da primeira consulta.

Então eu executo esta consulta:

SELECT DISTINCT TOP 200 
    dbo_GCSOCTPS.HDHPQ,
    dbo_GCSOCTPS.SOC_NUM, 
    dbo_GCSOCTPS.EFF_DATE,
    dbo_GCSOCTPS.CLASS_NUM,
    dbo_GCSOCTPS.CANC_DATE,
    GC_TBMED.MED_SOC_NUM,
    GC_TBMED.MED_EFF_DATE,
    GC_TBMED.MED_CLASS_NUM,
    GC_TBMED.MED_CANC_DATE
FROM
    [dbo].[AS_tblTBMED] GC_TBMED
LEFT JOIN 
    dbo.GCSOCTPS dbo_GCSOCTPS ON (GC_TBMED.MED_CLASS_NUM = dbo_GCSOCTPS.CLASS_NUM) 
                              AND (GC_TBMED.MED_SOC_NUM = dbo_GCSOCTPS.SOC_NUM)
                              AND (GC_TBMED.MED_EFF_DATE = CAST(dbo_GCSOCTPS.EFF_DATE as DATE))
                              AND (GC_TBMED.MED_CANC_DATE = CAST(dbo_GCSOCTPS.CANC_DATE as DATE)) 
WHERE
    GC_TBMED.MED_SOC_NUM = '25521'
    AND GC_TBMED.MED_CLASS_NUM = '37'
    AND GC_TBMED.MED_CANC_DATE IS NULL
    AND dbo_GCSOCTPS.EFF_DATE >= '2025-01-01';

E um conjunto de registros vazio é retornado. Se eu comentar as duas datas na junção, obtenho dados. Portanto, presumo que os campos de data não estejam sendo equalizados corretamente, já que são iguais e, portanto, eu deveria obter dados se eles fossem incluídos na consulta.

sql
  • 4 respostas
  • 178 Views
Martin Hope
dan-kli
Asked: 2025-04-29 00:13:46 +0800 CST

Bloquear uma linha em um gatilho

  • 6

Tenho duas tabelas PostgreSQL: objectse metadata. Cada objeto tem uma sizepropriedade que representa seu tamanho em bytes e pode ser armazenado em um local exclusivo com storage_id. Nos metadados, a total_sizepropriedade de todos os objetos de cada armazenamento com um dado storage_idé mantida. Tabelas simplificadas:

CREATE TABLE IF NOT EXISTS objects (
  object_id UUID PRIMARY KEY,
  storage_id UUID NOT NULL,
  size BIGINT NOT NULL,
  FOREIGN KEY (storage_id) REFERENCES metadata(storage_id)
);

CREATE TABLE IF NOT EXISTS metadata (
  storage_id UUID PRIMARY KEY,
  total_size BIGINT DEFAULT 0
);

Para manter o total_sizena metadatatabela, tenho gatilhos que sempre que um objeto é inserido ou excluído, ele total_sizeé atualizado, ou seja, aqui está o gatilho para inserção:

CREATE OR REPLACE FUNCTION update_size_on_insert() RETURNS TRIGGER AS $$
BEGIN
  UPDATE metadata
  SET total_size = total_size + NEW.size
  WHERE storage_id = NEW.storage_id;
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE OR REPLACE TRIGGER trg_update_size_on_insert
AFTER INSERT ON objects
FOR EACH ROW
EXECUTE FUNCTION update_size_on_insert();

O problema é que inserções/exclusões simultâneas podem sobrescrever o comando, o total_sizeque leva a dados inválidos. Como posso alterar o gatilho para que ele contenha um bloqueio em nível de linhaSET total_size = total_size + NEW.size quando o comando for executado? Eu estava pensando na FOR UPDATEinstrução, mas isso requer um comando SELECT. Posso usar PERFORM ... FOR UPDATE;para bloquear a linha?

sql
  • 1 respostas
  • 67 Views
Martin Hope
Northernlad
Asked: 2025-04-26 22:48:11 +0800 CST

A consulta retorna uma data quando seleciono coluna WHERE = '' [duplicado]

  • 6
Esta pergunta já tem uma resposta aqui :
Por que inserir uma string vazia na coluna de data produz 1900-01-01 (1 resposta)
Fechado há 21 horas .

Estou executando uma consulta para verificar se algum registro contém um espaço em branco DateOfBirth, mas os dados retornados não são o que eu esperava.

Eu executei o seguinte:

SELECT TOP 5 DateOfBirth, *
FROM [MyDataBase].[dbo].[CustomerRecord] 
WHERE DateOfBirth = ''

Quando executo isso, meus resultados mostram linhas como esta:

EU IA Data de Nascimento Sobrenome
1 1900-01-01 Jones
2 1900-01-01 Diácono
6 1900-01-01 Bacon
10 1900-01-01 James
12 1900-01-01 Queimaduras

O Information_SCHEMA.Columnsmostra que a coluna é definida como datee COLUMN_DEFAULTé NULLe IS_NULLABLEestá definido como YES.

Então por que ele não retorna linhas em branco?

sql
  • 2 respostas
  • 58 Views
Martin Hope
oemer ok
Asked: 2025-04-26 11:51:36 +0800 CST

postgresql não pode converter text[] para uuid

  • 6

Eu tenho uma matriz como esta:

["f383224c-aa95-40c9-a4e4-fa41747f49c5","c783234c-aa95-40c9-a4e4-fa41747f49c6"]

E eu quero selecionar com qualquer, mas recebi um erro não é possível converter text[] para uuid

SELECT c.name FROM cars c 

LEFT JOIN location_orders_cars loc ON loc.car_id = c.id 

WHERE loc.user_id = ANY($1::uuid) AND loc.location_orders_id = $2 AND loc.is_back = NULL 

LIMIT 10;

$1 = matriz de UUID acima

$ 2 = 355

o que estou fazendo errado aqui?

sql
  • 2 respostas
  • 53 Views
Martin Hope
GH DevOps
Asked: 2025-04-25 22:36:05 +0800 CST

Lacunas e Ilhas Obtendo a Última Janela da Ilha

  • 6

Tenho uma tabela com alterações de status que quero dividir em ilhas e, eventualmente, obter minha ilha mais atual com base em quando meu status mudou. Estou usando esta consulta para recuperar os códigos de status atual, anterior e próximo da minha tabela:

select 
    *, 
    case 
        when ping.GpsStatusTypeId <> ping.previousStatus 
            then 1 
            else 0 
    end as islandStarted
from
    (select 
         Id,
         GpsStatusTypeId,
         CreatedAt,
         lag(GpsStatusTypeId, 1) over (order by CreatedAt) as previousStatus,
         lead(GpsStatusTypeId, 1) over (order by CreatedAt) as nextStatus
     from 
         dbo.GpsPing p) ping

O resultado é assim:

Eu ia ID do tipo de status do GPS Criado em status anterior próximoStatus ilhaIniciada
78E8C372-B7BE-4EED-8600-4925E7B66DBF 6 2025-04-23 20:31:10.917 6 21 0
5CB42B3F-2542-4372-A169-5B664D971152 21 2025-04-23 17:46:40.217 6 21 1
F57421EF-43AE-42C5-B766-C1CC07277B2E 21 2025-04-24 15:50:38.000 21 21 0
3C07F71E-39EF-4728-B0EF-DF8E5B9AE529 21 2025-04-24 17:07:38.000 21 21 0
5CB42B3F-2542-4372-A169-5B664D971152 21 2025-04-24 17:08:38.000 21 NULO 0

Quero retirar apenas minha última ilha ( GpsStatusTypeId = 21) do resultado.

sql
  • 1 respostas
  • 52 Views
Martin Hope
Ben
Asked: 2025-04-25 00:26:18 +0800 CST

Existe uma maneira de "normalizar" meus dados como eles estão atualmente?

  • 4

Temos um banco de dados Access que usamos para enviar amostras de teste. Temos 18 métodos diferentes que podemos executar, e cada método normalmente tem um número diferente de execuções de teste associadas a ele (embora isso dependa do remetente). Sendo assim, nosso banco de dados atual permite apenas uma entrada de método por registro, para que o método possa ser facilmente associado às execuções necessárias; o problema com essa abordagem é que qualquer amostra pode exigir qualquer quantidade de métodos, o que, por sua vez, requer mais entradas de registro (com nossa configuração atual).

Tenho pesquisado uma maneira de fazer com que haja múltiplas seleções de métodos por registro. Sei que isso resultaria em dados "desnormalizados", mas é para facilitar a vida do remetente/solicitante. Quero então usar uma consulta ou outro meio para "normalizar" os dados para as equipes de teste (ou seja, separar os registros por método selecionado).

A mesa de apoio que eu criei se parece um pouco com isso (é mais larga):

Back-end

Gostaria que ficasse assim:

MétodoSplit

O código SQL para esta consulta é:

SELECT [Sample SubmissionSingleBatch].AutoID, 
[Sample SubmissionSingleBatch].[Lab Batch ID], 
[Sample SubmissionSingleBatch].[IRIS Batch ID], 
[Sample SubmissionSingleBatch].Requester, 
[Sample SubmissionSingleBatch].Samples, 
GetRunsWanted([Method].[Value],[CFPPLinearRuns],[CFPPRuns],
[CFPP12Runs],[CloudMiniRuns],[CloudRuns],[Conf_CFPPRuns],
[Conf_CloudMiniRuns],[Conf_CloudRuns],[Conf_HFRRRuns],
[Conf_PourMiniRuns],[Conf_PourAutoRuns],[DistRuns],[HFRRRuns],
[PourMiniRuns],[PourAutoRuns],[Pour_MANRuns],[RancimatRuns],
[SFPPRuns]) AS Runs, 
[Sample SubmissionSingleBatch].Method.Value AS Method,
 GetPriorityWanted([Method].[Value],[CFPPLinearPriority],
[CFPPPriority],[CFPP12Priority],[CloudMiniPriority],[CloudPriority],
[Conf_CFPPPriority],[Conf_CloudMiniPriority],[Conf_CloudPriority],
[Conf_HFRRPriority],[Conf_PourMiniPriority],[Conf_PourAutoPriority],
[DistPriority],[HFRRPriority],[PourMiniPriority],[PourAutoPriority],
[Pour_MANPriority],[RancimatPriority],[SFPPPriority]) AS Priority, 
[Sample SubmissionSingleBatch].[Instrument Specific], 
[Sample SubmissionSingleBatch].[Drop-Off date], 
[Sample SubmissionSingleBatch].Comments, 
[Sample SubmissionSingleBatch].[Samples in Class 1 FC?], 
[Sample SubmissionSingleBatch].[Flash Point of sample °C],
 GetReceivedWanted([Method].[Value],[CFPPLinearReceived],
[CFPPReceived],[CFPP12Received],[CloudMiniReceived],[CloudReceived],
[Conf_CFPPReceived],[Conf_CloudMiniReceived],[Conf_CloudReceived],
[Conf_HFRRReceived],[Conf_PourMiniReceived],[Conf_PourAutoReceived],
[DistReceived],[HFRRReceived],[PourMiniReceived],[PourAutoReceived],
[Pour_MANReceived],[RancimatReceived],[SFPPReceived]) AS Received, 
GetStartedWanted([Method].[Value],[CFPPLinearStarted],[CFPPStarted],
[CFPP12Started],[CloudMiniStarted],[CloudStarted],[Conf_CFPPStarted],
[Conf_CloudMiniStarted],[Conf_CloudStarted],[Conf_HFRRStarted],
[Conf_PourMiniStarted],[Conf_PourAutoStarted],[DistStarted],
[HFRRStarted],[PourMiniStarted],[PourAutoStarted],[Pour_MANStarted],
[RancimatStarted],[SFPPStarted]) AS Started,
 GetFinishedWanted([Method].[Value],[CFPPLinearFinished],
[CFPPFinished],[CFPP12Finished],[CloudMiniFinished],[CloudFinished],
[Conf_CFPPFinished],[Conf_CloudMiniFinished],[Conf_CloudFinished],
[Conf_HFRRFinished],[Conf_PourMiniFinished],[Conf_PourAutoFinished],
[DistFinished],[HFRRFinished],[PourMiniFinished],[PourAutoFinished],
[Pour_MANFinished],[RancimatFinished],[SFPPFinished]) AS Finished, 
[Sample SubmissionSingleBatch].[Retain?]
FROM 
[Sample SubmissionSingleBatch];

Esta segunda imagem é exatamente o que eu quero. O problema é que se trata de uma consulta na qual tenho uma função VBA personalizada em execução (código fornecido abaixo) e, nesta saída, os valores das execuções não podem ser editados. Eu precisaria que eles fossem editáveis ​​caso ocorresse um erro de entrada, um valor de execução precisasse ser alterado, etc.

Entendo que posso simplesmente editar os dados na tabela inicial, mas tenho certeza de que é óbvio que a segunda imagem tem uma aparência muito mais amigável.

Existe uma maneira de obter o que preciso ou estou levando o Access além de sua capacidade/limites?

Código da função:

Function GetRunsWanted(MethodValue As String, CFPPLinearRuns As Variant, 
     CFPPRuns As Variant, CFPP12Runs As Variant, CloudMiniRuns As Variant, 
     CloudRuns As Variant, Conf_CFPPRuns As Variant, 
     Conf_CloudMiniRuns As Variant, Conf_CloudRuns As Variant, 
     Conf_HFRRRuns As Variant, Conf_PourMiniRuns As Variant,
     Conf_PourAutoRuns As Variant, DistRuns As Variant, 
     HFRRRuns As Variant, PourMiniRuns As Variant, 
     PourAutoRuns As Variant, Pour_MANRuns As Variant, 
     RancimatRuns As Variant, SFPPRuns As Variant) As Variant
    Select Case MethodValue
        Case "CFPP LINEAR/EN16329"
            GetRunsWanted = CFPPLinearRuns
        Case "CFPP/LQP055"
            GetRunsWanted = CFPPRuns
        Case "CFPP12"
            GetRunsWanted = CFPP12Runs
        Case "CLOUD MINI/ASTM D7689"
            GetRunsWanted = CloudMiniRuns
        Case "CLOUD/ASTM D5771"
            GetRunsWanted = CloudRuns
        Case "Conf_CFPP/LQP055"
            GetRunsWanted = Conf_CFPPRuns
        Case "Conf_CLOUD MINI/ASTM D7689"
            GetRunsWanted = Conf_CloudMiniRuns
        Case "Conf_CLOUD/ASTM D5771"
            GetRunsWanted = Conf_CloudRuns
        Case "Conf_HFRR/ISO12156"
            GetRunsWanted = Conf_HFRRRuns
        Case "Conf_POUR MPP/ASTM D7346"
            GetRunsWanted = Conf_PourMiniRuns
        Case "Conf_POUR_AUTO/ASTM D5950"
            GetRunsWanted = Conf_PourAutoRuns
        Case "DIST_D86"
            GetRunsWanted = DistRuns
        Case "HFRR/ISO12156"
            GetRunsWanted = HFRRRuns
        Case "POUR MPP/ASTM D7346"
            GetRunsWanted = PourMiniRuns
        Case "POUR_AUTO/ASTM D5950"
            GetRunsWanted = PourAutoRuns
        Case "POUR_MAN/ASTM D97"
            GetRunsWanted = Pour_MANRuns
        Case "RANCIMAT/LQP092"
            GetRunsWanted = RancimatRuns
        Case "SFPP"
            GetRunsWanted = SFPPRuns
        Case Else
            GetRunsWanted = Null
    End Select
End Function
sql
  • 1 respostas
  • 92 Views
Martin Hope
Banone
Asked: 2025-04-24 20:45:18 +0800 CST

Oracle-DB, Unindo 3 Tabelas Limitando a segunda sem usar LATERAL() ou aninhamento

  • 8

Olá a todos, estou com um problema específico. Estou usando o Oracle DB

Para o exemplo, usarei o banco de dados Northwind.

Quero unir as tabelas: Clientes , Pedidos , Detalhes do pedido e Produtos .

Solução simples:

SELECT Customers.customerid, Customers.companyname, 
       Orders.orderid, Orders.orderdate, 
       Products.productname, Products.unitprice
FROM Customers
INNER JOIN Orders
  ON Customers.customerid= Orders.customerid
INNER JOIN Orderdetails 
  ON Orders.orderid = Orderdetails.orderid
INNER JOIN Products 
  ON Orderdetails.productid = Products.productid

Agora, quero limitar a saída aos 3 pedidos mais recentes por cliente, mostrando apenas o produto mais caro do pedido. A saída ficaria mais ou menos assim (Edição: a tabela não está sendo exibida corretamente):

ID do cliente nome da empresa id do pedido data do pedido nome do produto preço unitário
ALFKI Alfreds Futterkiste 11011 1998-04-09 Flotemysost 22
ALFKI Alfreds Futterkiste 10952 1998-03-16 Chucrute Rössle 46
ALFKI Alfreds Futterkiste 10835 15/01/1998 Raclette Courdavault 55
ANATR Ana Trujillo Emparedados e sorvetes 10926 1998-03-04 Mussarela de Giovanni 35
ANATR Ana Trujillo Emparedados e sorvetes 10759 28/11/1997 Mascarpone Fabioli 32
ANATR Ana Trujillo Emparedados e sorvetes 10625 1997-08-08 Camembert Pierrot 34
ANTÔN Antonio Moreno Taqueria 10856 28/01/1998 Mudança 19
... ... ... ... ... ...

Tenho uma solução usando LATERAL()e uma subseleção, mas, especialmente em big data, quero usar isso, LATERAL()tem muitos custos e torna o processo bastante lento. Então, quero ter uma solução SEMLATERAL()

Outra solução que tenho tentado é usar, ROW_NUMBER()que é muito mais rápida:

Select * FROM( 
  SELECT Customers.customerid, Customers.companyname, 
         Orders.orderid, Orders.orderdate, 
         Products.productname, Products.unitprice,
         ROW_NUMBER() OVER (PARTITION BY Customers.customerid
                            ORDER BY o.orderdate desc, p.unitprice desc ) AS rn
        ...
 ) WHERE rn <= 3;

Agora, se o limite fosse 1, não haveria problema. Mas não consigo encontrar uma solução aceitável para um limite >= 2 para os pedidos, como expliquei acima. Tentei uma segunda solução ROW_NUMBER() OVER (PARTIONION BY Orders.orderid ...), mas para que isso funcionasse, precisaria de algum aninhamento. O problema com o aninhamento é que estou prestes a criar algo como um analisador sintático para uma aplicação. E aninhamento em excesso pode se tornar muito complicado e confuso (especialmente para fins de manutenção).

Então eu estava pensando em uma junção, existe uma solução SQL pura no Oracle para:

  • Junte 3 ou mais mesas.
  • Use um Limite >= 2 em uma tabela (B) no meio da Junção que tem várias junções com outra tabela a seguir.
  • Isso não usa LATERAL()
  • Não é necessário aninhamento?

Editar/Adicionado: A maneira que tenho usado LATERAL():

Como este é um banco de dados de exemplo, tive que reestruturar o LATERAL que estava usando. (Para o exemplo do Northwind, tenho que unir produtos em detalhes do pedido em pedidos, no meu banco de dados não preciso da etapa extra com uma tabela entre eles)

SELECT C.customerid, C.companyname, 
       O.orderid, O.orderdate, 
       P.productname, P.unitprice
FROM Customers C
INNER JOIN LATERAL( 
  SELECT Orders.orderid, Orders.orderdate FROM Orders 
  WHERE Orders.customerid = C.customerid 
  ORDER BY orderdate DESC FETCH FIRST 3 ROWS ONLY ) O 
  ON 1=1 
INNER JOIN LATERAL( 
  SELECT Products.unitprice, Products.productname FROM Orderdetails 
  INNER JOIN Products ON Products.productid = Orderdetails.productid 
  WHERE Orderdetails.orderid = O.orderid 
  ORDER BY Products.unitprice DESC FETCH FIRST 1 ROWS ONLY) P on 1=1

Usei ON 1=1porque a instrução on é obrigatória para o Oracle em uma instrução Join, mas já estou unindo dentro do LATERAL().

sql
  • 1 respostas
  • 66 Views
Martin Hope
Jimin Lim
Asked: 2025-04-24 15:58:44 +0800 CST

Como aplicar o índice espacial na minha situação sem usar 'or' e 'union all'

  • 6

Tenho refatorado usando o índice espacial em Haversine,

Eu queria escrever uma instrução SQL que verificasse postagens em um raio de 10 km com o valor de ponto (0,90) para obter informações sem distância, mas confirmei que o índice não é usado se 'ou' for usado.

Então, tentei combinar as duas consultas SELECT usando UNION ALL , mas o desempenho permaneceu tão lento quanto antes, tornando-o ineficaz. Testei isso com 50.000 linhas de dados e não houve melhora perceptível — mesmo com o índice espacial sendo usado corretamente neste caso.

Como último recurso, pensei em separar as postagens sem informações de distância das postagens com informações de distância para separar a API, mas a interface mudou e agora o front não consegue refatorar, então quero excluí-la o máximo possível. Obrigado 🙏

select b1_0.id,
   b1_0.title,
   b1_0.item_time,
   b1_0.item_price,
   b1_0.created_date,
   b1_0.chat_count,
   b1_0.scrap_count,
   st_distance_sphere(b1_0.location, ST_GeomFromText('POINT(127.0 37.5)', 4326)),
   b1_0.address,
   b1_0.board_state,
   (select i1_0.stored_file_name
    from image i1_0
    where i1_0.board_id = b1_0.id
    order by i1_0.id LIMIT 1)
from board b1_0
where b1_0.board_type = 'SELL'
  and (ST_Contains(ST_Buffer(ST_GeomFromText('POINT(127.0 37.5)', 4326), 0.1), b1_0.location)
           OR (latitude = 90.0 AND longitude = 0.0))
order by b1_0.created_date desc
limit 0, 8;
sql
  • 1 respostas
  • 67 Views
Martin Hope
Alexandr X
Asked: 2025-04-24 02:22:05 +0800 CST

A tabela não possui ID, a data está contida em duas colunas

  • 6

Tenho uma tabela na qual um novo registro é adicionado aproximadamente a cada segundo. O ID está faltando na tabela. A coluna "Hora" mostra o tempo em milissegundos, que é zerado ao final do dia.

A coluna "Data" contém uma data no formato dia-mês-ano. O que devo escrever em uma consulta SQL para obter o último registro adicionado a cada 1-2 segundos?

insira a descrição da imagem aqui

sql
  • 1 respostas
  • 42 Views
Martin Hope
Enrico Gobbo
Asked: 2025-04-23 00:03:02 +0800 CST

Função LAG aninhada (tipo isso)

  • 7

Eu tenho essa mesa

Código de Máquina DoCreation CódigoDeEstadoDaMáquina
DM139 2024-04-03 00:32:17.377 99
DM139 2024-04-03 00:32:49.080 0
DM139 2024-04-03 01:51:14.427 99
DM139 2024-04-03 01:51:45.643 0
DM139 2024-04-03 06:07:38.357 3
DM139 2024-04-03 06:07:39.043 0
DM139 2024-04-03 06:23:37.433 100
DM139 2024-04-03 06:23:43.697 0
DM139 2024-04-03 06:24:46.153 1
DM139 2024-04-03 06:25:02.467 0
DM139 2024-04-03 06:46:50.410 100
DM139 2024-04-03 06:47:29.247 0
DM139 2024-04-03 06:47:46.397 100
DM139 2024-04-03 06:53:47.160 0
DM139 2024-04-03 06:59:41.633 1
DM139 2024-04-03 06:59:54.550 0
DM139 2024-04-03 07:00:03.203 1
DM139 2024-04-03 07:00:06.437 0
DM139 2024-04-03 07:00:14.247 1
DM139 2024-04-03 07:00:17.683 2
DM139 2024-04-03 07:00:18.153 1
DM139 2024-04-03 07:00:18.840 2
DM139 2024-04-03 07:00:26.860 1
DM139 2024-04-03 07:00:46.387 2

cada registro representa uma "mudança de estado" da máquina específica DM139 onde

  • MachineCode = código da máquina (nvarchar)
  • DoCreation = registro de data e hora de quando a máquina mudou seu estado (data e hora)
  • MachineStateCode = novo estado da máquina, onde 99 = reinicializando, 0 = inicializando, 3 = erro, 1 = iniciando, 2 = funcionando e assim por diante (int)

Preciso criar uma nova coluna, vamos chamá-la de MachineStateCodeAdjusted, onde seu valor é igual a 3 se o MachineStateCode anterior for 3 e o MachineStateCode atual não for 2, caso contrário, deve ter o valor atual do MachineStateCode. (a próxima tabela é o que preciso)

Código de Máquina DoCreation CódigoDeEstadoDaMáquina MachineStateCodeAjustado
DM139 2024-04-03 00:32:17.377 99 99
DM139 2024-04-03 00:32:49.080 0 0
DM139 2024-04-03 01:51:14.427 99 99
DM139 2024-04-03 01:51:45.643 0 0
DM139 2024-04-03 06:07:38.357 3 3
DM139 2024-04-03 06:07:39.043 0 3
DM139 2024-04-03 06:23:37.433 100 3
DM139 2024-04-03 06:23:43.697 0 3
DM139 2024-04-03 06:24:46.153 1 3
DM139 2024-04-03 06:25:02.467 0 3
DM139 2024-04-03 06:46:50.410 100 3
DM139 2024-04-03 06:47:29.247 0 3
DM139 2024-04-03 06:47:46.397 100 3
DM139 2024-04-03 06:53:47.160 0 3
DM139 2024-04-03 06:59:41.633 1 3
DM139 2024-04-03 06:59:54.550 0 3
DM139 2024-04-03 07:00:03.203 1 3
DM139 2024-04-03 07:00:06.437 0 3
DM139 2024-04-03 07:00:14.247 1 3
DM139 2024-04-03 07:00:17.683 2 2
DM139 2024-04-03 07:00:18.153 1 1
DM139 2024-04-03 07:00:18.840 2 2
DM139 2024-04-03 07:00:26.860 1 1
DM139 2024-04-03 07:00:46.387 2 2

Usei a função LAG para obter o MachineStateCode anterior (e funciona), mas para funcionar como eu quero, preciso obter o MachineStateCodeAdjusted anterior, que não é acessível para a função LAG.

A consulta SQL que estou executando é esta:

   SELECT MachineCode
       , DoCreation
   , MachineStateCode
   , IIF(LAG(MachineStateCode, 1, MachineStateCode) OVER (ORDER BY DoCreation ASC) = 3 
  AND MachineStateCode<>2, 3, MachineStateCode)  AS MachineStateCodeAdjusted       
  FROM mch.MachineStateChanges

e o resultado que obtive me mostra claramente que não funciona como eu quero

Código de Máquina DoCreation CódigoDeEstadoDaMáquina MachineStateCodeAjustado
DM139 2024-04-03 00:32:17.377 99 99
DM139 2024-04-03 00:32:49.080 0 0
DM139 2024-04-03 01:51:14.427 99 99
DM139 2024-04-03 01:51:45.643 0 0
DM139 2024-04-03 06:07:38.357 3 3
DM139 2024-04-03 06:07:39.043 0 3
DM139 2024-04-03 06:23:37.433 100 100 ERRADOS
DM139 2024-04-03 06:23:43.697 0 0 ERRADO
DM139 2024-04-03 06:24:46.153 1 1 ERRADO

Também tentei com um CTE recursivo e funciona, mas é muito lento! A extração da consulta leva 4 minutos e 2 dias de trabalho, enquanto eu preciso extrair 1 ano!

Qual é a melhor (e rápida) abordagem para consertar isso?

sql
  • 3 respostas
  • 85 Views

Sidebar

Stats

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

    Reformatar números, inserindo separadores em posições fixas

    • 6 respostas
  • Marko Smith

    Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não?

    • 2 respostas
  • Marko Smith

    Problema com extensão desinstalada automaticamente do VScode (tema Material)

    • 2 respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Martin Hope
    Fantastic Mr Fox Somente o tipo copiável não é aceito na implementação std::vector do MSVC 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant Encontre o próximo dia da semana usando o cronógrafo 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor O inicializador de membro do construtor pode incluir a inicialização de outro membro? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul O C++20 mudou para permitir a conversão de `type(&)[N]` de matriz de limites conhecidos para `type(&)[]` de matriz de limites desconhecidos? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann Como/por que {2,3,10} e {x,3,10} com x=2 são ordenados de forma diferente? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

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