Выберите лучшие 10 записей для каждой категории

Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException вообще.

См. также: A хороший список лучших практик

Я бы добавил, очень важно, хорошо использовать модификатор final. Использование "окончательной" модификатор, когда это применимо в Java

Сводка:

  1. Используйте модификатор final для обеспечения хорошей инициализации.
  2. Избегайте возврата null в методы, например, при возврате пустых коллекций.
  3. Использовать аннотации @NotNull и @Nullable
  4. Быстрое завершение работы и использование утверждений, чтобы избежать распространения нулевых объектов через все приложение, когда они не должен быть пустым.
  5. Сначала используйте значения с известным объектом: if("knownObject".equals(unknownObject)
  6. Предпочитают valueOf() поверх toString ().
  7. Используйте null safe StringUtils StringUtils.isEmpty(null).

189
задан morgb 23 September 2016 в 08:21
поделиться

5 ответов

При использовании SQL 2005, можно сделать что-то вроде этого...

SELECT rs.Field1,rs.Field2 
    FROM (
        SELECT Field1,Field2, Rank() 
          over (Partition BY Section
                ORDER BY RankCriteria DESC ) AS Rank
        FROM table
        ) rs WHERE Rank <= 10

, Если Ваш RankCriteria имеет связи тогда, можно возвратить больше чем 10 строк, и решение Matt может быть лучше для Вас.

200
ответ дан Darrel Miller 23 November 2019 в 05:39
поделиться

оператор UNION мог бы работать на Вас? Имейте один ВЫБОР для каждого раздела, затем ОБЪЕДИНЕНИЕ их вместе. Угадайте, что это только работало бы на постоянное число разделов все же.

4
ответ дан sblundy 23 November 2019 в 05:39
поделиться

Если Вы знаете, каковы разделы, можно сделать:

select top 10 * from table where section=1
union
select top 10 * from table where section=2
union
select top 10 * from table where section=3
9
ответ дан Blorgbeard 23 November 2019 в 05:39
поделиться

Я делаю это этот путь:

SELECT a.* FROM articles AS a
  LEFT JOIN articles AS a2 
    ON a.section = a2.section AND a.article_date <= a2.article_date
GROUP BY a.article_id
HAVING COUNT(*) <= 10;
<час>

обновление: Этот пример GROUP BY работает в MySQL и SQLite только, потому что те базы данных являются более разрешающими, чем стандартный SQL относительно GROUP BY. Большинство реализаций SQL требует, чтобы все столбцы в списке выборки, которые не являются частью составного выражения, были также в GROUP BY.

18
ответ дан Bill Karwin 23 November 2019 в 05:39
поделиться

Это работает над SQL Server 2005 (отредактированный для отражения разъяснения):

select *
from Things t
where t.ThingID in (
    select top 10 ThingID
    from Things tt
    where tt.Section = t.Section and tt.ThingDate = @Date
    order by tt.DateEntered desc
    )
    and t.ThingDate = @Date
order by Section, DateEntered desc
35
ответ дан Matt Hamilton 23 November 2019 в 05:39
поделиться
Другие вопросы по тегам:

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