Nano Hash - криптовалюты, майнинг, программирование

SQL для получения списка дат, а также дней до и после без дубликатов

Мне нужно отобразить список дат, который у меня есть в таблице

SELECT mydate AS MyDate, 1 AS DateType
FROM myTable
WHERE myTable.fkId = @MyFkId;

1 января 2010 г. - 1
2 января 2010 г. - 1
10 января 2010 г. - 1

Без проблем. Однако теперь мне нужно отображать дату до и дату после, а также с другим типом даты.

31 декабря 2009 г. - 2
1 января 2010 г. - 1
2 января 2010 г. - 1
3 января 2010 г. - 2
9 января 2010 г. - 2
10 января 2010 г. - 1
11 января 2010 г. - 2

Я думал, что могу использовать союз

SELECT MyDate, DateType
FROM (
    SELECT mydate - 1 AS MyDate, 2 AS DateType
    FROM myTable
    WHERE myTable.fkId = @MyFkId;

    UNION

    SELECT mydate + 1 AS MyDate, 2 AS DateType
    FROM myTable
    WHERE myTable.fkId = @MyFkId;

    UNION

    SELECT mydate AS MyDate, 1 AS DateType
    FROM myTable
    WHERE myTable.fkId = @MyFkId;
) AS myCombinedDateTable

Однако это включает дубликаты исходных дат.

31 декабря 2009 г. - 2
1 января 2010 г. - 2
1 января 2010 г. - 1
2 января 2010 г. - 2
2 января 2010 г. - 1
3 января 2010 г. - 2
9 января 2010 г. - 2
10 января 2010 г. - 1
11 января 2010 г. - 2

Как мне лучше всего удалить эти дубликаты? Я рассматриваю временную таблицу, но не уверен, что это лучший способ сделать это.

Мне также кажется, что это может привести к проблемам с производительностью, поскольку я запускаю один и тот же запрос три раза.

Как лучше всего обработать этот запрос?


  • Технически они не являются дубликатами, так как типы дат разные. Какой тип даты вы хотите показать, когда есть дубликаты? 11.03.2010
  • @OrbMan, вы правы, я хотел бы отображать тип 1, если дата повторяется, и игнорировать тип 2. 11.03.2010
  • откуда Jan 1, 2009 - 2... (обратите внимание на ян и 2009). 11.03.2010
  • @Габи, толстые пальцы, я исправлю 11.03.2010

Ответы:


1

Хотя вы приняли решение, позвольте мне дать это решение для справки:

SELECT MyDate, Min(DateType)
From
(
  SELECT MyDate + T1.RecordType AS MyDate, T1.DateType
  FROM
  (
    Select 1 AS RecordType, 2 AS DateType
    Union ALL
    Select 0 AS RecordType, 1 AS DateType
    Union ALL
    Select -1 AS RecordType, 2 AS DateType
  ) AS T1
  CROSS JOIN myTable
  Where myTable.fkId = @MyFkId
) AS CombinedTable
Group By MyDate

Преимущество этого решения в том, что myTable запрашивается только один раз, в данном случае у нас есть фильтр по fkID, поэтому сейчас производительность не будет иметь значения, но если нам нужно оценить сложный запрос, тогда этот метод может нормально работать по отношению к Union.

11.03.2010
  • Это выглядит действительно хорошо, я сравниваю эффективность прямо сейчас. Однако мне пришлось внести пару изменений в ваш код. Я обновлю образец 11.03.2010
  • Спасибо, я переключил ответ здесь, потому что производительность лучше. Чтения ввода-вывода составляют около 1/3 от другого решения, а ЦП постоянно меньше. Продолжительность довольно похожа, но ваш запрос всегда меньше. Спасибо всем за помощь 11.03.2010

  • 2

    Это должно сработать для вас:

    SELECT MyDate, min(DateType) as DateType
    FROM (
        SELECT mydate - 1 AS MyDate, 2 AS DateType
        FROM myTable
        WHERE myTable.fkId = @MyFkId;
    
        UNION
    
        SELECT mydate + 1 AS MyDate, 2 AS DateType
        FROM myTable
        WHERE myTable.fkId = @MyFkId;
    
        UNION ALL
    
        SELECT mydate AS MyDate, 1 AS DateType
        FROM myTable
        WHERE myTable.fkId = @MyFkId;
    ) AS myCombinedDateTable
    group by MyDate
    

    Примечание. Я изменил второй UNION на UNION ALL для лучшей производительности; последний подзапрос никогда не будет иметь дубликатов с первыми двумя подзапросами, поскольку DateType всегда равно 2 для первых двух и 1 для последнего запроса UNIONed.

    11.03.2010
  • реквизит для возвращения быстрее, чем я! 11.03.2010
  • Спасибо!! Теперь мне нужно изучить UNION vs UNION ALL. Ты узнаешь что-то новое каждый день. 11.03.2010
  • Для других, не знающих разницы, см. этот вопрос stackoverflow.com/questions/49925/ 11.03.2010

  • 3

    Пробовал это, и это работает. Обратите внимание, что я использовал DATEADD, чтобы заставить его работать с моей локальной копией SQL, которая называется SQL2008.

    SELECT MyDate, Min(DateType)
    FROM (
        SELECT DATEADD(DAY,-1,mydate) AS MyDate, 2 AS DateType
        FROM myTable
        WHERE myTable.fkId = @MyFkId
    
        UNION
    
        SELECT DATEADD(DAY,1,mydate) as MyDate, 2 AS DateType
        FROM myTable
        WHERE myTable.fkId = @MyFkId
    
        UNION
    
        SELECT mydate AS MyDate, 1 AS DateType
        FROM myTable
        WHERE myTable.fkId = @MyFkId
    ) AS myCombinedDateTable
    group by Mydate
    
    11.03.2010
  • select getdate() - 1 отлично работает на моем SQL Express 2008, в чем проблема, с которой вы столкнулись? 11.03.2010
  • Плохо, я определил MyDate как Date, а не как DateTime. Объявите как дату, и SQL2008 выдаст ошибку. В последнее время у меня есть привычка использовать только тип даты, так как я ненавижу иметь дело со временем! :-) 11.03.2010
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..