СКЛ СЕРВЕР СЕЛЕКТИНГ-РОУ

Если у меня есть эта приведенная ниже таблица

   id         time
   start      08.00 AM 
   stop       09.00 AM
   stop       09.30 AM
   start      09.30 AM
   start      11.00 AM
   start      11.30 AM
   stop       11.40 AM
   stop       12.00 PM

I want output that only take every first start and every start after stop and the latest stop

Решение?

Это - то, как продукция я хочу:

   id         time
   start      08.00 AM 
   stop       09.00 AM
   start      09.30 AM
   stop       11.40 AM
   stop       12.00 PM
2
nl ja de
от того стола, не там никакие другие колонки как id идентификатора?
добавлено автор Carls Jr., источник
от того, что я вижу, ценности в ID, как предполагается, не являются id. Проектируйте мудрый, у вас уже есть проблема.
добавлено автор Carls Jr., источник
Проектируйте его как id=1 статус =' start' время =' 9:00 AM' статус id=2 =' stop' время =' 9:30 AM' и и т.д...., таким образом, мы будем знать, какой вход ряда на первом месте.
добавлено автор Carls Jr., источник
по тому, как действительно ли это - назначение?
добавлено автор Carls Jr., источник
почему остановка потребности на последнем ряде в результате?
добавлено автор Aleksandr Fedorenko, источник
Пожалуйста делают , пишут его тогда.:) That' s важная часть вопроса.
добавлено автор Andriy M, источник
Времена будут быть принятыми во внимание. Иды (или безотносительно) только необходимы как дополнительное время, чтобы решить ситуации, где остановка и начало происходит в точно то же самое время. Это doesn' t должны быть дополнительной колонкой на самом деле. Возможно, there' s правило, что, если два отличных события совпадают, нужно всегда рассматриваться перед другим? Как начало перед остановка , возможно?
добавлено автор Andriy M, источник
Как можно быть уверены, что останавливается, 9:30 прибывает перед начало, 9:30 а не наоборот? То же самое идет о начало, 11:30 и остановка, 11:30 . There' s ничто (по крайней мере, you' ve ничего не раскрыл), который предлагает особый заказ, в котором должны интерпретироваться ряды.
добавлено автор Andriy M, источник
Таким образом, что вы попробовали?
добавлено автор hims056, источник
Ах, that' s, почему первый статус - начало в этом примере...
добавлено автор Jacco, источник
останавливайтесь всегда перед началом , потому что машина первый статус всегда останавливается и затем запускается , i' m просто не пишут его на моем посту.
добавлено автор user2020598, источник
Я полностью новичок об этой вещи, that' s, почему я понятия не имею, что я предполагаю, чтобы сделать. Пожалуйста, дайте некоторые предложения.
добавлено автор user2020598, источник
Пожалуйста, дайте некоторые решения
добавлено автор user2020598, источник
id идентификатора только начинается и останавливается, это был новообращенный от 0 == остановка и 1 == начало
добавлено автор user2020598, источник
если я изменяю ID в статус, как я могу сделать продукцию как, я хочу? У меня есть машина, которая хранила данные как стол, который я отправляю, я хочу преобразовать его как продукция стола, которую я объявляю также.
добавлено автор user2020598, источник
или если я ввел как свой стол, как я могу проектировать его мудрый?
добавлено автор user2020598, источник
I' m жаль о: начало, 11:30 и остановка, 11:30 it' s неправильно. но для остановки, 9:30 наступает перед началом, 9:30. Я подразумеваю, что конец машинной остановки статуса - 9:30, и это изменяется на машинный статус 09.30, начало
добавлено автор user2020598, источник
Я могу изменить id в номер строки, но что я хочу на основе машинного статуса занять фактическое время, не на основе идентификационного номера или чего-то как этот
добавлено автор user2020598, источник
Мне нужна остановка на последнем ряде потому что, если работа по машине, сделанной, это означает полностью остановку не только некоторый разрыв.
добавлено автор user2020598, источник
@Jacco, это, похожи, я хочу sqlfiddle.com/#! 3/97181/1 но вы могли, пожалуйста, сделать его с колонкой временного интервала, пожалуйста?
добавлено автор user2020598, источник

4 ответы

Whitout, имеющий любой первичный ключ или некоторый различный id для каждого ряда... единственное решение, которое прибывает в мой ум, является чем-то как:

select rn, id , time
from
(select ROW_NUMBER() over (order by time) as rn, id, time from test 
where id = 'start'
union
select ROW_NUMBER() over (order by time) as rn, id, time from test 
where id = 'stop'
) d
order by rn

В основном я сделал союз между начатым и остановленными рядами как это:

 (select ROW_NUMBER() over (order by time) as rn, id, time from test 
    where id = 'start'
    union
    select ROW_NUMBER() over (order by time) as rn, id, time from test 
    where id = 'stop'
    ) d

прибыль:

    1   start   08.00
    2   start   11.00
    3   start   12.00
    4   start   13.00
    1   stop    09.00
    2   stop    10.00
    3   stop    14.00
    4   stop    15.00

От оригинального входа:

id          time
start   08.00
stop    09.00
stop    10.00
start   11.00
start   12.00
start   13.00
stop    14.00
stop    15.00

Теперь только необходимо заказать им, они владеют номером строки..., который является этим rn.

И в конце вы будете иметь:

1   start   08.00
1   stop    09.00
2   start   11.00
2   stop    10.00
3   start   12.00
3   stop    14.00
4   start   13.00
4   stop    15.00

@Note: мои ценности в качестве примера близко к вашим..., но вымышленные...

4
добавлено
Там isn' t слишком много, чтобы объяснить... я просто использовал ROW_NUMBER() функция, чтобы создать своего рода id..., таким образом, я могу устроить те ряды
добавлено автор avi, источник
Я отредактировал почту...
добавлено автор avi, источник
Не могли бы Вы объяснить его? I' m жаль я просто новичок. Спасибо
добавлено автор user2020598, источник
Не могли бы Вы показать мне свой стол, прежде чем он обработал? Пожалуйста, посмотрите мой пост на вершине, я думаю, что это не произведено, что я хочу.
добавлено автор user2020598, источник
как заказать им, они владеют номером строки? I' m жаль снова i' m просто новичок
добавлено автор user2020598, источник
Don' t вы думаете, что номер строки 2 запутывающий, он начинается в 11.00 и останавливается в 10.00?
добавлено автор user2020598, источник
 ;WITH cte AS
 (
  SELECT id AS pr, [time], ROW_NUMBER() OVER(ORDER BY [time]) AS Id,
         COUNT(*) OVER() AS cnt        
  FROM dbo.test21 t1
  ), cte2 AS
 (
  SELECT Id, pr, [time], pr AS prStart, [time] AS StopTime, pr AS prStop, [time] AS StartTime
  FROM cte
  WHERE Id = 1
  UNION ALL
  SELECT c1.Id, 
         CASE WHEN c1.pr != c2.pr OR c1.Id = c1.cnt THEN c1.pr ELSE c2.pr END,
         CASE WHEN c1.pr != c2.pr OR c1.Id = c1.cnt THEN c1.[time] ELSE c2.[time] END,
         c1.pr, c1.[time], c2.pr, c2.[time]
  FROM cte c1 JOIN cte2 c2 ON c1.Id = c2.Id + 1
  )
  SELECT pr, [time], MIN(StartTime) AS StartTime,
         MAX(DATEDIFF(minute, StartTime, [time])) AS Interval
  FROM cte2
  GROUP BY pr, [time]

Demo on SQLFiddle

2
добавлено
Попытка @user2020598 теперь
добавлено автор Aleksandr Fedorenko, источник
Колонка интервала дополнительного времени. Попробовать
добавлено автор Aleksandr Fedorenko, источник
это написано в ваших ожидаемых результатах.
добавлено автор Aleksandr Fedorenko, источник
Почему первая остановка только в 09.30?
добавлено автор user2020598, источник
Не могли бы Вы добавить некоторый столбец времени интервала? Таким образом, это будет похоже что Jacco ниже почты. Пожалуйста.
добавлено автор user2020598, источник
поблагодарите Вас ваш пост точно, что я хочу
добавлено автор user2020598, источник
I' m жаль вы могли, пожалуйста, сделать колонку временного интервала , которые похожи на это? sqlfiddle.com/#! 3/0079a/7
добавлено автор user2020598, источник
Почему первая остановка только в 09.30, но 09.00? Ваш ответ является лучшим, я надеюсь, что вы могли продолжить, отвечают на мои вопросы.
добавлено автор user2020598, источник
спасибо вы великие.. спасибо
добавлено автор user2020598, источник
.What делают вы думаете об этой проблеме stackoverflow.com/questions/14582242/sql-selecting-row
добавлено автор user2020598, источник

У меня есть некоторая альтернатива, которая даст результаты в другом формате. Но это действительно возвращает запрошенную информацию.

SELECT
  MIN([main].[Start]) AS [Start],
  [main].[End] AS [Stop],
  DATEDIFF(minute, MIN([main].[Start]), [main].[End]) AS [Minutes]
FROM
(
  SELECT
    [sub].[Start],
    MIN([sub].[End]) AS [End]
  FROM
  (
    SELECT
      [start].[time] AS [Start],
      [start].[id] AS [StartingStatus],
      [end].[time] AS [End],
      [end].[id] AS [EndingStatus]
    FROM [Log] [start],  [Log] [end]
    WHERE [start].[id] = 'start' 
      AND [start].[time] < [end].[time]
      AND [start].[id] <> [end].[id]
  ) AS [sub]
  GROUP BY
    [sub].[Start],
    [sub].[StartingStatus]
) AS [main]
GROUP BY
  [main].[End]

Basically, it first selects all records where [id] = 'start'. Then it finds all records with a later time and where [id] <> 'start'.

На этих отчетах это группируется каждым 'началом' и определяет первую 'остановку '-time. Тогда эти отчеты сгруппированы снова, чтобы найти первое 'начало '-time для каждой 'остановки '-time.

Результаты похожи на это:

+--------------------------------+--------------------------------+---------+
| START                          | STOP                           | MINUTES |
+================================+================================+=========+
| January, 29 2013 08:00:00+0000 | January, 29 2013 09:00:00+0000 | 60      |
+--------------------------------+--------------------------------+---------+
| January, 29 2013 09:30:00+0000 | January, 29 2013 11:30:00+0000 | 120     |
+--------------------------------+--------------------------------+---------+
| January, 29 2013 11:30:00+0000 | January, 29 2013 12:00:00+0000 | 30      |
+--------------------------------+--------------------------------+---------+

Скрипка найдена здесь.

PS: Этот ответ - основа на моем ответе здесь.

2
добавлено
На данном этапе я могу только внести свои +1.
добавлено автор Andriy M, источник
@user2020598: Согласно вашему примеру, первая остановка после 8:00 является в 9:00 . Почему вы хотите к нему быть 9:30 ? Кроме того, вы никогда не говорили, что хотели результаты как это. It' s просто Jacco' s предположение, что вы могли бы счесть этот вид продукции более удобным. Если вам нравится он этот путь, пожалуйста, примите этот ответ и задайте новый вопрос о том, как изменить его так, это показывает различное время окончания. I' m говорящий о новом вопросе, потому что многие люди уже способствовали решению вашего оригинального вопроса, таким образом, это был бы infair к , редактируют его только, чтобы приспособить для этого вида продукции.
добавлено автор Andriy M, источник
Ах, НЕТ! It' s не принятый, I' m потерянный снова! @user2020598, пожалуйста, создайте новый вопрос для этого. Просто, потому что у меня есть минуты в моем ответе, это за пределами (оригинального) объема вашего вопроса.
добавлено автор Jacco, источник
Нет нет не, I' m не потерянный! Я полностью понимаю, так как мой ответ принят!
добавлено автор Jacco, источник
Я соглашаюсь с @AndriyM и I' m потерянный в том, что OP точно хочет в этом пункте.
добавлено автор Jacco, источник
первый раз остановки должен составить 90 минут или до 09.30. Не могли бы Вы изменить свой код, таким образом, он дает результат как, я хочу?thank you
добавлено автор user2020598, источник
Что вы думаете об этой проблеме stackoverflow.com/questions/14582242/sql-selecting-row
добавлено автор user2020598, источник
I' m жаль то, что я хочу, время, прежде следующее время начала или прошлый раз остановки прежде затем начинается
добавлено автор user2020598, источник
@Jacco, это, похожи, я хочу sqlfiddle.com/#! 3/97181/1, но вы могли, пожалуйста, сделать его с колонкой временного интервала, пожалуйста?
добавлено автор user2020598, источник

После разъяснений, сделанных в комментариях, это оказывается классиком проблема.

Принятие этого является SQL Server 2005 +, вы могли использовать следующий метод:

WITH partitioned AS (
  SELECT
    *,
    grp = ROW_NUMBER() OVER (ORDER BY time, CASE id WHEN 'stop' THEN 0 ELSE 1 END)
        - ROW_NUMBER() OVER (PARTITION BY id ORDER BY time)
  FROM atable
)
SELECT
  id,
  time = MIN(time)
FROM partitioned
GROUP BY
  id,
  grp
ORDER BY
  time
;
1
добавлено
Этот вопрос производит почти точно ту же самую продукцию как в вашем вопросе. Единственная разница - последний ряд. Этот вопрос doesn' t возвращают его, потому что это - остановка ряд, который следует за другим остановка ряд, в то время как вы, кажется, хотите остановку , ряды, чтобы следовать начало ряды и наоборот. И это doesn' t, кажется, имеют смысл также показывать два последовательных остановка события. Я имею в виду, если бы была остановка в какой-то момент, какое значение она имела бы, чтобы указать, что была другая остановка после этого и но не было никакого промежутка начала?
добавлено автор Andriy M, источник
@user2020598: вы не могли только применить его к своим данным? С другой стороны, вы могли также подготовить образец данных в Скрипке SQL для меня, тогда я приспособлю этот сценарий к вашему образцу данных.
добавлено автор Andriy M, источник
@user2020598: Спасибо за разрешение мне использовать другой people' s Скрипки.:) Хорошо, здесь вы идете: 1., 2.. Вы don' t действительно как выполнение вашей собственной домашней работы, сделайте вас.:)
добавлено автор Andriy M, источник
мой крайний срок просто crazzzzy.., Почему первая остановка только в 09.30?
добавлено автор user2020598, источник
Не могли бы Вы показать мне на в sqlfiddle.com
добавлено автор user2020598, источник
sqlfiddle.com/#! 3/97181/1
добавлено автор user2020598, источник
sqlfiddle.com/#! 3/a268a/1
добавлено автор user2020598, источник
SqlCom.ru - Стиль жизни SQL
SqlCom.ru - Стиль жизни SQL
908 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только MS SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz). Предложения в @sql_ninja

SQL_Ninja
SQL_Ninja
340 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz)