Получите список записей с многократными въездами в ту же дату

Как Брайан Гетц указал на в комментарии , основой для конструктивного решения было позволить адаптировать метод к функциональному интерфейсу так же, как вы можете назвать метод , т. е. вы можете вызвать метод возвращаемого значения и проигнорировать возвращаемое значение.

Когда дело доходит до лямбда-выражений, все становится немного сложнее. Существуют две формы лямбда-выражений: (args) -> expression и (args) -> { statements* }.

Независимо от того, совместима ли вторая форма void, зависит ли вопрос о том, значение, например () -> { return ""; } не совместим с void, но совместим с выражением, тогда как () -> {} или () -> { return; } совместимы void. Обратите внимание, что () -> { for(;;); } и () -> { throw new RuntimeException(); } оба являются совместимыми с void и совместимыми по значению, поскольку они не выполняются нормально.

Форма (arg) -> expression совместима по значению, если выражение оценивается значением , Но есть также выражения, которые являются операторами одновременно. Эти выражения могут иметь побочный эффект и поэтому могут быть записаны как автономные инструкции для создания только побочного эффекта, игнорируя полученный результат. Аналогично, форма (arg) -> expression может быть void совместимой, если выражение также является выражением.

Выражение формы s -> s не может быть void совместимым, так как s а не заявление, т. е. вы не можете писать s -> { s; }. С другой стороны, s -> s.toString() может быть void совместимым, потому что вызовы методов являются операторами. Аналогично, s -> i++ может быть void совместимым, поскольку приращения могут использоваться как оператор, поэтому s -> { i++; } также является допустимым. Конечно, i должен быть полем для этого, а не локальной переменной.

Спецификация языка Java §14.8. В выражениях выражения перечислены все выражения, которые могут использоваться в качестве операторов. Помимо уже упомянутых операторов вызова и операторов increment / decment, он присваивает имена и выражения создания экземпляра класса, поэтому s -> foo=s и s -> new WhatEver(s) также совместимы void.

В качестве примечания стороны, форма (arg) -> methodReturningVoid(arg) - это форма выражения только , которая не совместима со значением.

5
задан Vertexwahn 4 March 2016 в 16:03
поделиться

15 ответов

SELECT id, datefield, count(*) FROM tablename GROUP BY datefield
  HAVING count(*) > 1
4
ответ дан 18 December 2019 в 07:32
поделиться

Так как Вы упомянули, что нуждались во всех трех записях, я предполагаю, что Вы хотите данные также. Если Вам просто нужен идентификатор, можно просто использовать группу запросом. Для возврата данных просто соедините с этим как подзапрос

select * from table
inner join (
     select id, date
     from table 
     group by id, date 
     having count(*) > 1) grouped 
       on table.id = grouped.id and table.date = grouped.date
2
ответ дан 18 December 2019 в 07:32
поделиться

Лучшая публикация (Leigh Caldwell) не возвратит дублирующиеся записи и должна вниз кивнуться. Это определит дублирующиеся ключи. Кроме того, это не будет работать, если Ваша база данных не сделает разрешает группу не включать все избранные поля (многие не делают).

Если Ваше поле даты будет включать метку времени затем, то необходимо будет усечь это использование одного из методов, зарегистрированных выше (я предпочитаю: dateadd (dd, 0, datediff (dd,0,@DateTime))).

Я думаю, что Scott Nichols дал корректный ответ и здесь является сценарием для доказательства его:

declare @duplicates table (
id int,
datestamp datetime,
ipsum varchar(200))

insert into @duplicates (id,datestamp,ipsum) values (1,'9/12/2008','ipsum primis in faucibus')
insert into @duplicates (id,datestamp,ipsum) values (1,'9/12/2008','Vivamus consectetuer. ')
insert into @duplicates (id,datestamp,ipsum) values (2,'9/12/2008','condimentum posuere, quam.')
insert into @duplicates (id,datestamp,ipsum) values (2,'9/13/2008','Donec eu sapien vel dui')
insert into @duplicates (id,datestamp,ipsum) values (3,'9/12/2008','In velit nulla, faucibus sed')

select a.* from @duplicates a
inner join (select id,datestamp, count(1) as number
              from @duplicates
          group by id,datestamp
            having count(1) > 1) b
       on (a.id = b.id and a.datestamp = b.datestamp)
2
ответ дан 18 December 2019 в 07:32
поделиться
SELECT RecordID
FROM aTable
WHERE SameDate IN
    (SELECT SameDate
    FROM aTable
    GROUP BY SameDate
    HAVING COUNT(SameDate) > 1)
2
ответ дан 18 December 2019 в 07:32
поделиться

Если я понимаю Ваш вопрос правильно, Вы могли бы сделать что-то подобное:

select
     recordID
from
    tablewithrecords as a
    left join (
        select
          count(recordID) as recordcount
        from
          tblwithrecords
        where
          recorddate='9/10/08'
     ) as b on a.recordID=b.recordID
where
     b.recordcount>1
1
ответ дан 18 December 2019 в 07:32
поделиться

http://www.sql-server-performance.com/articles/dba/delete_duplicates_p1.aspx получит Вас движение. Кроме того, http://en.allexperts.com/q/MS-SQL-1450/2008/8/SQL-query-fetch-duplicate.htm

Я нашел их путем поиска Google 'sql дублирующиеся данные'. Вы будете видеть, что это не необычная проблема.

1
ответ дан 18 December 2019 в 07:32
поделиться
SELECT * FROM the_table WHERE ROW(record_id,date) IN 
  ( SELECT record_id, date FROM the_table 
    GROUP BY record_id, date WHERE COUNT(*) > 1 )
1
ответ дан 18 December 2019 в 07:32
поделиться

Для соответствия на просто части даты Даты и времени:

select * from Table
where id in (
    select alias1.id from Table alias1, Table alias2
    where alias1.id != alias2.id
        and datediff(day, alias1.date, alias2.date) = 0
)

Я думаю. Это основано на моем предположении, что Вам нужны они в тот же день месяц и год, но не то же время суток, таким образом, я не использовал Группу пунктом. Из других сообщений похоже, что я, возможно, более умно использовал пункт Наличия. Можно ли использовать наличие или группу по datediff выражению?

1
ответ дан 18 December 2019 в 07:32
поделиться

Я не уверен, что понял Ваш вопрос, но возможно Вы хотите что-то вроде этого:

SELECT id, COUNT(*) AS same_date FROM foo GROUP BY id, date HAVING same_date = 3;

Это просто записано из моего ума и не протестировано всегда. Считайте GROUP BY и ИМЕЮЩИЙ раздел здесь. Если это не то, что Вы имели в виду, проигнорируйте этот ответ.

1
ответ дан 18 December 2019 в 07:32
поделиться

Обратите внимание, что существует некоторая дополнительная обработка, необходимая при использовании поля SQL DateTime. Если у Вас есть те данные дополнительного времени там, то Вы не можете только использовать тот столбец как есть. Необходимо нормализовать DateTime к единственному значению для всех записей, содержавших в течение дня.

В SQL Server вот немного приема, чтобы сделать это:

SELECT CAST(FLOOR(CAST(CURRENT_TIMESTAMP AS float)) AS DATETIME)

Вы бросаете DateTime в плавание, которое представляет Дату как целочисленную часть и Время как часть дня, это передается. Обрубите ту десятичную часть, затем бросьте тот назад в DateTime, и у Вас есть полночь в начале того дня.

1
ответ дан 18 December 2019 в 07:32
поделиться

Не зная точную структуру Ваших таблиц или какую базу данных Вы используете, трудно ответить. Однако при использовании MS SQL и если у Вас есть истинное поле даты/времени, которое имеет различные времена, что записи вводились в ту же дату затем, что-то вроде этого должно работать:

select record_id, 
       convert(varchar, date_created, 101) as log date, 
       count(distinct date_created) as num_of_entries
from record_log_table
group by convert(varchar, date_created, 101), record_id
having count(distinct date_created) > 1

Надеюсь, это поможет.

1
ответ дан 18 December 2019 в 07:32
поделиться
SELECT id, count(*)
INTO #tmp
FROM tablename
WHERE date = @date
GROUP BY id
HAVING count(*) > 1

SELECT *
FROM tablename t
WHERE EXISTS (SELECT 1 FROM #tmp WHERE id = t.id)

DROP TABLE tablename
1
ответ дан 18 December 2019 в 07:32
поделиться

TrickyNixon пишет;

Лучшая публикация (Leigh Caldwell) не возвратит дублирующиеся записи и должна вниз кивнуться.

Все же вопрос не спрашивает о дублирующихся записях. Это спрашивает о дублирующихся рекордных идентификаторах в ту же дату...

GROUP BY, НАЛИЧИЕ кажется хорошим мне. Я использовал его в производстве прежде.

.

Что-то, чтобы не упустить:

ВЫБРАТЬ... ОТ... GROUP BY... НАЛИЧИЕ количества (*)> 1

В большинстве систем баз данных, выполнит в O (NlogN) время. Это - хорошее решение. (Выбор является O (N), вид является O (NlogN), группа является O (N), наличие является O (N) - Худший случай. Лучший случай, дата индексируется, и операция вида более эффективна.)

.

Выберите... из....... где a.data = b.date

Предоставленный только идиоты делают Декартово соединение. Но Вы смотрите на O (N^2) время. Для некоторых баз данных это также составляет "временную" таблицу. Это все незначительно, когда Ваша таблица имеет только 10 строк. Но это собирается причинять боль, когда та таблица растет!

Ссылка Оби: http://en.wikipedia.org/wiki/Join_ (SQL)

1
ответ дан 18 December 2019 в 07:32
поделиться
select id from tbl where date in
(select date from tbl group by date having count(*)>1)
1
ответ дан 18 December 2019 в 07:32
поделиться

GROUP BY с HAVING Ваш друг:

select id, count(*) from records group by date having count(*) > 1
1
ответ дан 18 December 2019 в 07:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: