Выберите, где строки не совпадают для нескольких записей записей состояния
Привет, у меня есть приведенная ниже структура таблицы, и мне нужна помощь с запросом
ID Disp Type State CreateDate 1 I5 Det OH 1/1/2018 08:42:00 1 I5 Det CO 1/1/2018 08:43:00 1 I5 Det NC 1/2/2018 05:16:00 1 I5 ReDet OH 1/3/2018 14:02:00 1 I5 ReDet CO 1/3/2018 14:03:00 1 I5 ReDet NC 1/3/2018 14:04:00 2 I5 Det FL 1/4/2018 16:07:00 2 I5 ReDet FL 1/4/2018 16:07:00 3 I5 Det FL 1/4/2018 10:05:02 3 I5 ReDet CA 1/4/2018 10:05:03 3 I5 ReDet FL 1/5/2018 09:17:00 3 I5 ReDet CA 1/6/2018 12:04:00 4 I5 Det PA 1/7/2018 10:27:00 4 I5 Det NE 1/8/2018 10:14:00 4 I5 Det PA 1/8/2018 13:43:00 4 I5 ReDet NE 1/9/2018 09:01:00
То, что я хочу, находится ниже:
1. для каждого идентификатора, имеющего несколько состояний, тип должен соответствовать состояниям в том порядке, в котором они были введены.
Экс:
ID 1:
OH -> Det 1st entry(1/1/2018) matches CO -> Det 1st entry(1/1/2018) and NC -> Det 1st entry(1/2/2018)
И
OH -> ReDet 2st entry(3/1/2018) matches CO -> ReDet 2st entry(3/1/2018) and NC -> ReDet 2st entry(3/1/2018)
ID 2 не имеет нескольких состояний
ID 3 - 1-я запись типа каждого государства не совпадает:
FL -> Det 1st entry's (1/4/2018) type does not match CA -> ReDet 1st entry(1/5/2018)
ID 4 - 2-я запись типа каждого государства не совпадает:
PA -> Det 1st entry(1/7/2018) type matches NE -> Det 1st entry(1/8/2018)
Но
PA -> Det 1st entry(1/8/2018) type does not match NE -> ReDet 1st entry(1/9/2018)
Мне нужны записи,в которых идентификатор имеет несколько состояний и 1-й, 2-й, 3-й,... тип записи каждого состояния не совпадает
Согласно таблице, выходные идентификаторы будут равны 3 и 4.
У меня есть ниже в качестве начального запроса:
SELECT * FROM dbo.tableLog AS log1 JOIN dbo.tableLog AS log2 ON log2.ID = log1.ID AND log2.state = log1.state WHERE log1.type <> log2.type
но я думаю, что я не там, где близко для того, что я хочу.
Любая помощь будет очень признательна.
Что я уже пробовал:
SELECT * FROM dbo.tableLog AS log1 JOIN dbo.tableLog AS log2 ON log2.ID = log1.ID AND log2.state = log1.state WHERE log1.type <> log2.type
Mike V Baker
Когда я читаю ваше описание, меня смущают записи, которые, по вашему мнению, должны быть в результирующем наборе. Взять например ID 1. У вас есть записи, где идентификатор и состояние совпадают. 1 & OH, 1 & CO, 1 & NC. Типы каждой из этих записей не совпадают с Ret <> DetRet. Это верно для каждого из этих наборов, поэтому все эти шесть записей для ID 1 будут квалифицироваться ID=ID и State=State и Type<>Type. Единственные, кого я вижу, которые не попали бы в это, - это ID3 & State CA и ID4 & State PA. Это единственные, которые будут исключены в соответствии с вашими критериями, поскольку их типы равны.
Member 4581741
Извините, если вопрос не совсем ясен.
- У вас есть записи, где личность и штат совпадают. 1 & OH, 1 & CO, 1 & NC. Типы каждой из этих записей не совпадают с Ret <> DetRet."
"Тип" 1-й записи каждого государства должен совпадать. ИД 1 и "дет" в качестве типа для каждого государства, для 1-го входа и 2 входа для каждого государства, для id 1 имеет тип "Рэдэт". Так что это хорошо.
Для ID3 и ID4 это не совпадает.
Кроме того, Det и ReDet-это всего лишь примеры типов. Это может быть любое из 5 значений.
Mike V Baker
I don't think I would trust the results given the columns you're describing here. The reason being that you're concerned with 1st entry, 2nd entry, 3rd entry, etc for each state and you're relying on 'natural order' to figure out which is 1st and 2nd. You don't have any indexing to control what's 1st, 2nd, 3rd.... To my knowledge there's nothing that guarantees the results will come to you in that natural order when you query. You have to create a column such as EntryOrder to use as a control and sort. You could create a composite index on ID + State + EntryOrder. (If I were doing this I'd consider using a separate table and a foreign key for states.) [1,OH,1], [1,OH,2], [1,CO,1], [1,CO,2], [1,NC,1], [1,NC,2]. Even after doing that I'm not sure it can be done in a single shot of sql. You can order by ID, EntryOrder, State to get them in the right order, group by ID, and EntryOrder and then concatenate the types and put the result in a temporary table. Then select from the table where the concatenated types are not equal. There's something else I was just looking at here https://stackoverflow.com/questions/273238/how-to-use-group-by-to-concatenate-strings-in-sql-server but I'm not sure it'll work for you. It doesn't include the comparison component.
Member 4581741
Существует поле id, но CreateDate можно использовать для определения последовательности записей для каждого состояния.