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 / 77181205
Accepted
Anthony
Anthony
Asked: 2023-09-26 23:01:31 +0800 CST2023-09-26 23:01:31 +0800 CST 2023-09-26 23:01:31 +0800 CST

SQL Retorna a primeira data anterior a nulos em uma lista

  • 772

Aqui estão meus dados

(Obrigado Jonas) Link do violino: http://sqlfiddle.com/#!18/7ff39/1

Fase de assinatura ID de Inscrição Data Data anterior
Utilização 1 23/02/2022 NULO
NULO 1 24/02/2022 23/02/2022
NULO 1 25/02/2022 23/02/2022
NULO 1 26/02/2022 23/02/2022
NULO 1 27/02/2022 23/02/2022
Utilização 1 28/02/2022 NULO
NULO 1 01/03/2022 28/02/2022
NULO 1 02/03/2022 28/02/2022
NULO 1 03/03/2022 28/02/2022
NULO 1 04/03/2022 28/02/2022
NULO 1 05/03/2022 28/02/2022
Utilização 1 06/03/2022 NULO

O que preciso retornar é o que está na coluna PreviousDate (além da coluna Date). Considerando cada SubscriptionId, quero encontrar a entrada anterior onde SubscriptionPhase não é NULL e retornar essa data, então uso essa data para outra coisa.

  • 3 3 respostas
  • 81 Views

3 respostas

  • Voted
  1. Best Answer
    siggemannen
    2023-09-26T23:33:12+08:002023-09-26T23:33:12+08:00

    Você pode usar a função window para obter o valor máximo da data:

        SELECT  *
        ,   CASE WHEN SubscriptionPhase IS NULL 
                THEN MAX(CASE WHEN subscriptionphase IS NOT NULL THEN cast(date AS date) END) OVER(partition BY subscriptionid ORDER BY cast(date AS date) rows BETWEEN unbounded preceding AND 1 preceding)
            END AS prevDate
        FROM    (
            VALUES  (N'Utilization', 1, N'2/23/2022', NULL)
            ,   (NULL, 1, N'2/24/2022', N'2/23/2022')
            ,   (NULL, 1, N'2/25/2022', N'2/23/2022')
            ,   (NULL, 1, N'2/26/2022', N'2/23/2022')
            ,   (NULL, 1, N'2/27/2022', N'2/23/2022')
            ,   (N'Utilization', 1, N'2/28/2022', NULL)
            ,   (NULL, 1, N'3/1/2022', N'2/28/2022')
            ,   (NULL, 1, N'3/2/2022', N'2/28/2022')
            ,   (NULL, 1, N'3/3/2022', N'2/28/2022')
            ,   (NULL, 1, N'3/4/2022', N'2/28/2022')
            ,   (NULL, 1, N'3/5/2022', N'2/28/2022')
            ,   (N'Utilization', 1, N'3/6/2022', NULL)
        ) t (SubscriptionPhase,SubscriptionId,Date,PreviousDate)
    

    CASE WHEN SubscriptionPhase IS NULL- é assim que a data é calculada apenas para linhas nulas

    MAX(CASE WHEN subscriptionphase IS NOT NULL THEN cast(date AS date) END) leva a data máxima em que a fase não é nula agrupada pelo ID. ORDER BY cast(date AS date)garante a classificação correta, ao mesmo tempo que rows BETWEEN unbounded preceding AND 1 precedinggarante que sua "janela" esteja nas linhas anteriores.

    • 2
  2. Zufar Sunagatov
    2023-09-26T23:09:21+08:002023-09-26T23:09:21+08:00

    O que preciso retornar é o que está na coluna PreviousDate. Considerando cada SubscriptionId, quero encontrar a entrada anterior onde SubscriptionPhase não é NULL e retornar essa data, então uso essa data para outra coisa.

    Espero ter entendido seus requisitos corretamente. É assim que posso ver esta consulta sql.

    SELECT SubscriptionId,Date,PreviousDate
    FROM (
      SELECT
        SubscriptionId,
        Date,
        SubscriptionPhase,
        LAG(Date, 1, NULL) OVER (PARTITION BY SubscriptionId ORDER BY Date) AS PreviousDate
      FROM table
    ) AS T
    WHERE SubscriptionPhase IS NULL
    ORDER BY SubscriptionId;
    
    • 1
  3. kiran prabhakar
    2023-09-26T23:35:27+08:002023-09-26T23:35:27+08:00

    Para retornar a primeira data anterior aos valores nulos em uma lista SQL, você pode usar uma combinação de funções SQL e uma subconsulta. Supondo que você tenha uma tabela com uma lista de datas e alguns valores nulos, aqui está um exemplo de como recuperar a primeira data anterior aos nulos:

    Digamos que você tenha uma tabela chamada sua_tabela com colunas data_coluna e valor_coluna. Você deseja encontrar a primeira data anterior aos valores nulos em value_column. Você pode usar uma consulta como esta:

    sql code 
    SELECT MAX(date_column) AS first_date_prior_to_nulls
    FROM your_table
    WHERE value_column IS NULL
      AND date_column < (
        SELECT MIN(date_column)
        FROM your_table
        WHERE value_column IS NULL
      );
    

    Aqui está o que esta consulta faz:

    A subconsulta (SELECT MIN(date_column) FROM your_table WHERE value_column IS NULL)encontra o valor mínimo da data entre as linhas onde value_column é nulo. Isso representa a data mais antiga com um valor nulo.

    A consulta principal então procura o valor máximo da data (MAX(date_column))entre as linhas onde value_column é nulo, (WHERE value_column IS NULL)mas também restringe a data a ser menor que a data mínima encontrada na subconsulta. Isso garante que você obtenha o valor máximo de data antes dos valores nulos.

    O resultado desta consulta será a primeira data anterior aos valores nulos na value_column.

    • 0

relate perguntas

  • Adicionar número de série para atividade de cópia ao blob

  • A fonte dinâmica do empacotador duplica artefatos

  • Selecione linhas por grupo com 1s consecutivos

  • Lista de chamada de API de gráfico subscritoSkus estados Privilégios insuficientes enquanto os privilégios são concedidos

  • Função para criar DFs separados com base no valor da coluna

Sidebar

Stats

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

    destaque o código em HTML usando <font color="#xxx">

    • 2 respostas
  • Marko Smith

    Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}?

    • 1 respostas
  • Marko Smith

    Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)?

    • 2 respostas
  • Marko Smith

    Por que as compreensões de lista criam uma função internamente?

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 respostas
  • Marko Smith

    Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)?

    • 4 respostas
  • Marko Smith

    Por que o construtor de uma variável global não é chamado em uma biblioteca?

    • 1 respostas
  • Marko Smith

    Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto?

    • 1 respostas
  • Marko Smith

    Somente operações bit a bit para std::byte em C++ 17?

    • 1 respostas
  • Martin Hope
    fbrereto Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi Por que as compreensões de lista criam uma função internamente? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A formato fmt %H:%M:%S sem decimais 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python std::views::filter do C++20 não filtrando a visualização corretamente 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa Por que o construtor de uma variável global não é chamado em uma biblioteca? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev Por que os compiladores perdem a vetorização aqui? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan Somente operações bit a bit para std::byte em C++ 17? 2023-08-17 17:13:58 +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