так что у меня есть имя таблицы отчета, как это
No(autoincrement) Code Stats(bool)
--------------------------------------
1 F01 0
2 F02 0
3 F03 0
4 F03 1
5 F03 1
6 F04 1
7 F04 0
поэтому сценарий, если код имеет значение для статистики, является true, а затем отображает их все, и если код не имеет значения true, тогда отображается только false, поэтому результат, который я хочу, (примечание: у одного кода всегда есть 1 запись для значения false)
No(autoincrement) Code Stats
--------------------------------------------
1 F01 0
2 F02 0
4 F03 1
5 F03 1
6 F04 1
потому что f01 и f02 не имеют значения stats true, а затем показывают их и для случаев f03 и f04, потому что имеют значение true для stat, отображают их все true и игнорируют ложное значение
так как запрос для получения результата
Кажется, вам нужна DENSE_RANK()
select * from
(
select *,
dense_rank() over (partition by Code order by Stats desc) Seq
from table t
) t
where Seq = 1
Если вы не хотите идти с формой subquery
, вы можете исследовать вышеуказанные вещи через TOP со связками, доступными в SQL Server
select top 1 with ties [No(autoincrement)], Code, [Stats(bool)]
from table t
order by dense_rank() over (partition by Code order by [Stats(bool)] desc)
Поскольку MySQL
не имеет аналитической функции. Итак, вы можете исследовать эти вещи через UNION ALL
select *
from table t
where exists (
select 1 from table
where autoincrement = t.autoincrement and Stats = 1
) UNION ALL
select *
from table t
where not exists (
select 1 from table
where code = t.code and Stats = 1)
ORDER BY 1
SELECT No,Code,Stats FROM
(SELECT No,Code,Stats,
Case when @Code = t.Code Then
Case when @stats != t.stats Then
@DenseRank := @DenseRank + 1
ELSE
@DenseRank := 1
END
Else
@DenseRank := 1
END as DenseRank,
@Code :=t.code as VarCode,
@stats :=t.stats as varstatus
FROM Table1 t join
(Select @DenseRank := 1,@Code := '',@stats := '' )r
Order BY CODE,Stats DESC)
AS T1
WHERE
DenseRank=1
Order BY CODE,Stats DESC;
Выход
No Code Stats
1 F01 0
2 F02 0
4 F03 1
5 F03 1
6 F04 1
демонстрация