Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Заполнение строк в столбце значениями из определенной строки этого же столбца  [new]
Aknodl
Member

Откуда:
Сообщений: 12
Добрый день! Вот моя проблема,надеюсь на вашу помощь:
У меня есть 2 столбца- Гггг-мм-дд чч и user, записи в столбце юзеры появляюся каждый день только в 2 часах,утром и вечером. Юзеры разные.Задача: как мне заполнить соседние строки в столбце user по другим часам? соответственно если запись в столбце user появилась в 2017-01-08 04 то заполнить этим юзером нужно с 2017-01-07 19 до 2017-01-08-07
17 май 17, 12:29    [20489228]     Ответить | Цитировать Сообщить модератору
 Re: Заполнение строк в столбце значениями из определенной строки этого же столбца  [new]
aleksrov
Member

Откуда:
Сообщений: 948
Aknodl,

Извращение какое то, если я правильно понял задачу. Хоть убей не могу понять нафиг такое нужно, плодить ненужные записи. Если вам нужно нужно посчитать кол-во часов между юзером 1 и 2, так и сделайте это.
17 май 17, 12:54    [20489336]     Ответить | Цитировать Сообщить модератору
 Re: Заполнение строк в столбце значениями из определенной строки этого же столбца  [new]
Aknodl
Member

Откуда:
Сообщений: 12
aleksrov,
записи нужны для вывода в таблицу,где будет видно в какой час какой сотрудник работал. Если им запись сделана в 4 час,то он работал с 19-00 до 07-00, это нужно отобразить будет в таблице. Вот как сделать чтобы записи копировались никак не соображу...
17 май 17, 13:00    [20489366]     Ответить | Цитировать Сообщить модератору
 Re: Заполнение строк в столбце значениями из определенной строки этого же столбца  [new]
Aknodl
Member

Откуда:
Сообщений: 12
aleksrov,
тоесть я знаю что юзер работает с 07 до 19 часов и с 19 до 07, вот в каждый час имя юзера нужно отобразить
17 май 17, 13:01    [20489376]     Ответить | Цитировать Сообщить модератору
 Re: Заполнение строк в столбце значениями из определенной строки этого же столбца  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
Aknodl
aleksrov,
тоесть я знаю что юзер работает с 07 до 19 часов и с 19 до 07, вот в каждый час имя юзера нужно отобразить

Давайте уже кусок вашего говданных... Будем лепить конкод!
17 май 17, 13:03    [20489390]     Ответить | Цитировать Сообщить модератору
 Re: Заполнение строк в столбце значениями из определенной строки этого же столбца  [new]
aleksrov
Member

Откуда:
Сообщений: 948
Aknodl,

Понял. Все ровно такое в базе хранить нет никакого смысла. Вот при выгрузке и проверяйте это.
17 май 17, 13:05    [20489404]     Ответить | Цитировать Сообщить модератору
 Re: Заполнение строк в столбце значениями из определенной строки этого же столбца  [new]
Aknodl
Member

Откуда:
Сообщений: 12
Руслан Дамирович,
DECLARE @bdt DATETIME = Cast('08.01.2017 00:00:00' AS DATETIME)
DECLARE @edt DATETIME = Cast('09.01.2017 23:59:00' AS DATETIME)




select cal.dt
,[web_user]



from
(SELECT TOP (1000) [am/pm]

,[dt]
,[user_group]
,DATEADD(hour, DATEPART (HOUR, [edit_dt]),DATEADD(DAY, 0, DATEDIFF(DAY, 0, [edit_dt]))) as date
,datepart(hh,[edit_dt]) as dt2
,[edit_dt]
,[web_user]
,[id]

FROM [dbo].[dv_signature]
--join [dbo].[CalendarHR] cal

where dt between @bdt and @edt and[user_group] = 'НСС') tb
right join [dbo].[CalendarHR] cal on tb.date = cal.dt
where cal.dt between @bdt and @edt
17 май 17, 13:06    [20489412]     Ответить | Цитировать Сообщить модератору
 Re: Заполнение строк в столбце значениями из определенной строки этого же столбца  [new]
Aknodl
Member

Откуда:
Сообщений: 12
Руслан Дамирович,
вместо нулов заменить этим логином

К сообщению приложен файл. Размер - 65Kb
17 май 17, 13:10    [20489427]     Ответить | Цитировать Сообщить модератору
 Re: Заполнение строк в столбце значениями из определенной строки этого же столбца  [new]
Добрый Э - Эх
Guest
Aknodl,

RTFM - Заполнение NULL-группы предыдущим значением

Читать до конца! Там есть вполне себе годные решения... ;) :)
17 май 17, 13:12    [20489445]     Ответить | Цитировать Сообщить модератору
 Re: Заполнение строк в столбце значениями из определенной строки этого же столбца  [new]
Aknodl
Member

Откуда:
Сообщений: 12
Добрый Э - Эх,

попробовал предложенные варианты на свой пример,не особо помогло...
17 май 17, 14:01    [20489709]     Ответить | Цитировать Сообщить модератору
 Re: Заполнение строк в столбце значениями из определенной строки этого же столбца  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
Aknodl
Руслан Дамирович,
вместо нулов заменить этим логином

Я вас не картинку просил, а данные.
17 май 17, 15:07    [20490063]     Ответить | Цитировать Сообщить модератору
 Re: Заполнение строк в столбце значениями из определенной строки этого же столбца  [new]
Aknodl
Member

Откуда:
Сообщений: 12
Руслан Дамирович,

2017-01-08 00:00:00.000 NULL
2017-01-08 01:00:00.000 NULL
2017-01-08 02:00:00.000 NULL
2017-01-08 03:00:00.000 NULL
2017-01-08 04:00:00.000 konstantin_sonin
2017-01-08 05:00:00.000 NULL
2017-01-08 06:00:00.000 NULL
2017-01-08 07:00:00.000 NULL
2017-01-08 08:00:00.000 NULL
2017-01-08 09:00:00.000 NULL
2017-01-08 10:00:00.000 NULL
2017-01-08 11:00:00.000 NULL
2017-01-08 12:00:00.000 NULL
2017-01-08 13:00:00.000 NULL
2017-01-08 14:00:00.000 NULL
2017-01-08 15:00:00.000 NULL
2017-01-08 16:00:00.000 NULL
2017-01-08 17:00:00.000 tretyakov.aleksey
2017-01-08 18:00:00.000 NULL
2017-01-08 19:00:00.000 NULL
2017-01-08 20:00:00.000 NULL
2017-01-08 21:00:00.000 NULL
2017-01-08 22:00:00.000 NULL
2017-01-08 23:00:00.000 NULL
2017-01-09 00:00:00.000 NULL
2017-01-09 01:00:00.000 NULL
2017-01-09 02:00:00.000 NULL
2017-01-09 03:00:00.000 NULL
2017-01-09 04:00:00.000 NULL
2017-01-09 05:00:00.000 Tareev_DV
2017-01-09 06:00:00.000 NULL
2017-01-09 07:00:00.000 NULL
2017-01-09 08:00:00.000 NULL
2017-01-09 09:00:00.000 NULL
2017-01-09 10:00:00.000 NULL
2017-01-09 11:00:00.000 NULL
2017-01-09 12:00:00.000 NULL
2017-01-09 13:00:00.000 NULL
2017-01-09 14:00:00.000 NULL
2017-01-09 15:00:00.000 NULL
2017-01-09 16:00:00.000 NULL
2017-01-09 17:00:00.000 vinnikov.aleksey
2017-01-09 18:00:00.000 NULL
2017-01-09 19:00:00.000 NULL
2017-01-09 20:00:00.000 NULL
2017-01-09 21:00:00.000 NULL
2017-01-09 22:00:00.000 NULL
2017-01-09 23:00:00.000 NULL
17 май 17, 15:13    [20490103]     Ответить | Цитировать Сообщить модератору
 Re: Заполнение строк в столбце значениями из определенной строки этого же столбца  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
Aknodl
Руслан Дамирович, [длинная портянка фигни]

Осталось от вас добиться того, чтобы вы потрудились показать, как должна выглядеть оная портянка в конечном виде...
17 май 17, 15:23    [20490148]     Ответить | Цитировать Сообщить модератору
 Re: Заполнение строк в столбце значениями из определенной строки этого же столбца  [new]
Aknodl
Member

Откуда:
Сообщений: 12
Руслан Дамирович,
в конечном должно быть так...
2017-01-08 00:00:00.000 konstantin_sonin
2017-01-08 01:00:00.000 konstantin_sonin
2017-01-08 02:00:00.000 konstantin_sonin
2017-01-08 03:00:00.000 konstantin_sonin
2017-01-08 04:00:00.000 konstantin_sonin
2017-01-08 05:00:00.000 konstantin_sonin
2017-01-08 06:00:00.000 konstantin_sonin
2017-01-08 07:00:00.000 konstantin_sonin
2017-01-08 08:00:00.000 tretyakov.aleksey
2017-01-08 09:00:00.000 tretyakov.aleksey
2017-01-08 10:00:00.000 tretyakov.aleksey
2017-01-08 11:00:00.000 tretyakov.aleksey
2017-01-08 12:00:00.000 tretyakov.aleksey
2017-01-08 13:00:00.000 tretyakov.aleksey
2017-01-08 14:00:00.000 tretyakov.aleksey
2017-01-08 15:00:00.000 tretyakov.aleksey
2017-01-08 16:00:00.000 tretyakov.aleksey
2017-01-08 17:00:00.000 tretyakov.aleksey
2017-01-08 18:00:00.000 tretyakov.aleksey
2017-01-08 19:00:00.000 tretyakov.aleksey
2017-01-08 20:00:00.000 Tareev_DV
2017-01-08 21:00:00.000 Tareev_DV
2017-01-08 22:00:00.000 Tareev_DV
2017-01-08 23:00:00.000 Tareev_DV
2017-01-09 00:00:00.000 Tareev_DV
2017-01-09 01:00:00.000 Tareev_DV
2017-01-09 02:00:00.000 Tareev_DV
2017-01-09 03:00:00.000 Tareev_DV
2017-01-09 04:00:00.000 Tareev_DV
2017-01-09 05:00:00.000 Tareev_DV
2017-01-09 06:00:00.000 Tareev_DV
2017-01-09 07:00:00.000 Tareev_DV
2017-01-09 08:00:00.000 vinnikov.aleksey
2017-01-09 09:00:00.000 vinnikov.aleksey
2017-01-09 10:00:00.000 vinnikov.aleksey
2017-01-09 11:00:00.000 vinnikov.aleksey
2017-01-09 12:00:00.000 vinnikov.aleksey
2017-01-09 13:00:00.000 vinnikov.aleksey
2017-01-09 14:00:00.000 vinnikov.aleksey
2017-01-09 15:00:00.000 vinnikov.aleksey
2017-01-09 16:00:00.000 vinnikov.aleksey
2017-01-09 17:00:00.000 vinnikov.aleksey
2017-01-09 18:00:00.000 vinnikov.aleksey
2017-01-09 19:00:00.000 vinnikov.aleksey
2017-01-09 20:00:00.000 NULL
2017-01-09 21:00:00.000 NULL
2017-01-09 22:00:00.000 NULL
2017-01-09 23:00:00.000 NULL
17 май 17, 15:29    [20490174]     Ответить | Цитировать Сообщить модератору
 Re: Заполнение строк в столбце значениями из определенной строки этого же столбца  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
DECLARE @users TABLE (
  [timestamp] DATETIME,
  [login] VARCHAR(50)
)
INSERT
INTO
  @users
VALUES
  ( '2017-01-08T04:00:00.000', 'konstantin_sonin' ),
  ( '2017-01-08T17:00:00.000', 'tretyakov.aleksey' ),
  ( '2017-01-09T05:00:00.000', 'Tareev_DV' ),
  ( '2017-01-09T17:00:00.000', 'vinnikov.aleksey' )
;
DECLARE @min_dt DATETIME, @max_dt DATETIME
;
SELECT
  @min_dt = MIN( CONVERT( DATE, [timestamp] ) ),
  @max_dt = DATEADD( DAY, 1, MAX( CONVERT( DATE, [timestamp] ) ) )
FROM
  @users
;
WITH
us AS (
  SELECT
    [login],
    [prev] = CASE
        WHEN ss.[hh] BETWEEN 8 AND 19 THEN DATEADD( HOUR, 8 - ss.[hh], us.[timestamp] )
        WHEN ss.[hh] < 8 THEN DATEADD( HOUR, 20 - 24 - ss.[hh], us.[timestamp] )
        WHEN ss.[hh] > 19 THEN DATEADD( HOUR, 20 - ss.[hh], us.[timestamp] )
      END,
    [next] = CASE
        WHEN ss.[hh] BETWEEN 8 AND 19 THEN DATEADD( HOUR, 19 - ss.[hh], us.[timestamp] )
        WHEN ss.[hh] < 8 THEN DATEADD( HOUR, 7 - ss.[hh], us.[timestamp] )
        WHEN ss.[hh] > 19 THEN DATEADD( HOUR, 7 + 24 - ss.[hh], us.[timestamp] )
      END
  FROM
    @users us
    CROSS APPLY (
      SELECT
        [hh] = DATEPART( HOUR, us.[timestamp] )
    ) ss
),
ts AS (
  SELECT
    [timestamp] = @min_dt
  UNION ALL
  SELECT
    [timestamp] = DATEADD( HOUR, 1, ts.[timestamp] )
  FROM
    ts
  WHERE
    ts.[timestamp] < DATEADD( HOUR, -1, @max_dt )
)
SELECT
  ts.[timestamp],
  us.[login]
FROM
  ts
  LEFT JOIN us ON (
        us.[prev] <= ts.[timestamp]
    AND us.[next] >= ts.[timestamp] )
17 май 17, 15:53    [20490265]     Ответить | Цитировать Сообщить модератору
 Re: Заполнение строк в столбце значениями из определенной строки этого же столбца  [new]
Aknodl
Member

Откуда:
Сообщений: 12
Руслан Дамирович,

спасибо! но это для частного случая,мне же нужно это сделать чтобы можно было выбрать любой промежуток дат,данные о юзерах я беру из другой таблицы,но как видите тут идет время не по часам,из за этого проблема
am/pm dt user_group edit_dt web_user id
AM 2014-10-02 00:00:00.000 НСС 2014-11-07 14:00:41.520 root NULL
AM 2014-10-15 00:00:00.000 НС КЦ 2014-10-15 17:18:37.790 mih NULL
AM 2014-10-15 00:00:00.000 НСС 2014-10-15 18:19:49.373 denis_byshkin NULL
AM 2014-10-16 00:00:00.000 НСС 2014-10-16 05:36:57.313 denis_byshkin NULL
AM 2014-10-17 00:00:00.000 НСС 2014-10-17 06:22:22.637 tretyakov.aleksey NULL
AM 2014-10-18 00:00:00.000 НС КЦ 2014-10-18 03:19:00.250 ser2 NULL
AM 2014-10-18 00:00:00.000 НС ТЦ 2014-10-18 03:29:22.770 dim NULL
AM 2014-10-18 00:00:00.000 НСС 2014-10-18 05:49:11.053 vinnikov.aleksey NULL
AM 2014-10-19 00:00:00.000 НС КЦ 2014-10-19 04:53:22.697 sant NULL
AM 2014-10-20 00:00:00.000 НС КЦ 2014-10-20 04:36:11.847 valera NULL
AM 2014-10-20 00:00:00.000 НС ТЦ 2014-10-20 04:11:03.020 akhle NULL
AM 2014-10-21 00:00:00.000 НС КЦ 2014-10-21 04:10:34.763 mih NULL
AM 2014-10-21 00:00:00.000 НСС 2014-10-21 05:36:02.623 tretyakov.aleksey NULL
AM 2014-10-22 00:00:00.000 НС КЦ 2014-10-22 03:18:03.727 ser1 NULL
AM 2014-10-22 00:00:00.000 НС ТЦ 2014-10-22 04:39:37.963 dim NULL
AM 2014-10-23 00:00:00.000 НС КЦ 2014-10-23 04:41:57.700 sant NULL
AM 2014-10-23 00:00:00.000 НСС 2014-10-23 17:11:25.773 tretyakov.aleksey NULL
AM 2014-10-24 00:00:00.000 НСС 2014-10-24 05:46:08.173 denis_byshkin NULL
AM 2014-10-25 00:00:00.000 НС КЦ 2014-10-25 03:58:34.123 mih NULL
AM 2014-10-25 00:00:00.000 НС ТЦ 2014-10-25 04:00:05.730 vova1 NULL
AM 2014-10-25 00:00:00.000 НСС 2014-10-25 04:53:11.220 tretyakov.aleksey NULL
AM 2014-10-26 00:00:00.000 НС КЦ 2014-10-26 03:25:32.737 ser1 NULL
AM 2014-10-26 00:00:00.000 НС ТЦ 2014-10-26 03:32:22.080 dim NULL
AM 2014-10-26 00:00:00.000 НСС 2014-10-26 04:25:01.360 vinnikov.aleksey NULL
18 май 17, 07:17    [20491561]     Ответить | Цитировать Сообщить модератору
 Re: Заполнение строк в столбце значениями из определенной строки этого же столбца  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
Советую сменить профессию. Ничего личного, просто профессиональный совет.
DECLARE @users TABLE (
  [timestamp] DATETIME,
  [login] VARCHAR(50)
)
INSERT
INTO
  @users
VALUES
  ( '2017-01-08T04:23:10.000', 'konstantin_sonin' ),
  ( '2017-01-08T17:45:02.000', 'tretyakov.aleksey' ),
  ( '2017-01-09T05:16:30.000', 'Tareev_DV' ),
  ( '2017-01-09T17:27:04.000', 'vinnikov.aleksey' )
;
DECLARE @min_dt DATETIME, @max_dt DATETIME
;
SELECT
  @min_dt = MIN( CONVERT( DATE, [timestamp] ) ),
  @max_dt = DATEADD( DAY, 1, MAX( CONVERT( DATE, [timestamp] ) ) )
FROM
  @users
;
WITH
us AS (
  SELECT
    [login],
    [prev] = CASE
        WHEN ss.[hh] <  8 THEN DATEADD( HOUR, -4, ss.[dd] )
        WHEN ss.[hh] < 20 THEN DATEADD( HOUR,  8, ss.[dd] )
        ELSE                   DATEADD( HOUR, 20, ss.[dd] )
      END,
    [next] = CASE
        WHEN ss.[hh] <  8 THEN DATEADD( HOUR, 8, ss.[dd] )
        WHEN ss.[hh] < 20 THEN DATEADD( HOUR, 20, ss.[dd] )
        ELSE                   DATEADD( HOUR, 31, ss.[dd] )
      END
  FROM
    @users us
    CROSS APPLY (
      SELECT
        [dd] = CONVERT( DATETIME, CONVERT( DATE, us.[timestamp] ) ),
        [hh] = DATEPART( HOUR, us.[timestamp] )
    ) ss
),
ts AS (
  SELECT
    [timestamp] = @min_dt
  UNION ALL
  SELECT
    [timestamp] = DATEADD( HOUR, 1, ts.[timestamp] )
  FROM
    ts
  WHERE
    ts.[timestamp] < DATEADD( HOUR, -1, @max_dt )
)
SELECT
  ts.[timestamp],
  us.[login]
FROM
  ts
  LEFT JOIN us ON (
        us.[prev] <= ts.[timestamp]
    AND us.[next]  > ts.[timestamp] )
18 май 17, 08:59    [20491699]     Ответить | Цитировать Сообщить модератору
 Re: Заполнение строк в столбце значениями из определенной строки этого же столбца  [new]
Aknodl
Member

Откуда:
Сообщений: 12
Руслан Дамирович,
Пользователей не 4 а сколько угодно разных может быть,прочитайте мое сообщение выше,и отбор по дате отсутствует в вашем запросе, знаний не хватает,но я только начал изучать SQL
18 май 17, 09:38    [20491804]     Ответить | Цитировать Сообщить модератору
 Re: Заполнение строк в столбце значениями из определенной строки этого же столбца  [new]
CrazHunt
Member

Откуда:
Сообщений: 40
Aknodl,

готов Вам помочь написанием запроса абсолютно бесплатно, без СМС и регистраций, если в каждой строчке кода от Руслана Дамировича вы проставите комментарий с объяснением того, что в ней происходит и зачем, а перед каждым значимым блоком запроса пояснение к запросу.
18 май 17, 15:40    [20493274]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить