Mysql 从部分重复的数据中选择首选行

Mysql 从部分重复的数据中选择首选行,mysql,sql,having,Mysql,Sql,Having,我有以下疑问: select mb.id as meter_id ,ds.mydate as mydate ,mb.name as metergroup ,sum(ms.stand) as measured_cum_value ,me.name as energy_medium ,e.name as unit_of_measure ,min(ms.source) as source ,count(*) as debugcount FROM datumselec

我有以下疑问:

select 
  mb.id as meter_id
  ,ds.mydate as mydate
  ,mb.name as metergroup
  ,sum(ms.stand) as measured_cum_value 
  ,me.name as energy_medium
  ,e.name as unit_of_measure
  ,min(ms.source) as source
  ,count(*) as debugcount
FROM datumselect ds                            <<-- mem table with dates to query.
INNER JOIN metergroup mb ON (mb.building_id = 1)   
INNER JOIN meter m ON (m.metergroup_id = mb.id)  <<-- meters are grouped
INNER JOIN medium me ON (me.id = mb.medium_id)   <<-- lookuptables for normalization
INNER JOIN unit e ON (e.id = mb.unit_id)         <<-- ditto
INNER JOIN meterstand ms ON (ms.meter_id = m.id AND ms.mydate = ds.mydate)
group by ds.mydate, mb.id, ms.source  <<-- this is prob. broken.
having source = MIN(ms.source)   <<-- this `having` does not work !
ORDER BY mb.id, ds.mydate 
给出以下数据的更简单查询为:

SELECT 
  meter_id
  , mydate
  , sum(stand)
  , count(*) as debugcount
FROM meterstand
WHERE mydate IN (list_of_dates_im_interested_in)
GROUP BY meter_id, my_date
HAVING the_best(source) 
给定当前数据,debugcount应始终为1,但如果在上述查询中一个组中有多个仪表,则debugcount应为该组中的仪表数

我可以选择不同来源的值,我有: -手工源码,这是金色的; -从数据源读取数据源,某个地方的建筑物中的一个仪表; -计算数据,插值以弥补缺失数据

具有相同仪表id+mydate的单个数据点可以有多个源。 查询应优先选择手动源,而不是读取源,并且仅在没有其他数据可用时选择计算数据

以下是meterstand中的数据示例:


选择最佳数据点的正确查询语法是什么?

从外观上看,MySQL将枚举的排序顺序定义为它们在定义中列出的顺序。考虑到您已将顺序定义为它们将显示的相反顺序,我相信以下内容将如预期的那样起作用,尽管没有可测试的实例:

SELECT * 
FROM meterstand as a
JOIN (SELECT meter_id, mydate, MAX(source) as source
      FROM meterstand
      GROUP BY meter_id, mydate) as b
ON b.meter_id = a.meter_id
AND b.mydate = a.mydate
AND b.source = a.source
当然,假设[meter_id,mydate,source]是唯一的

看起来确实有一个bug导致枚举按其字符串值排序,而给定字符串,这对您毫无帮助。 如果它存在,或者您希望对使用顺序有更多的控制,您可能需要定义一个表:

Meter_Reading_Type
========================
Id   Description   Priority
1    Manual        10
2    Calculated    30
3    Read          20

然后将其引用为fk并按最小优先级排序。

如此简单,我想我陷入了思维扭曲复杂化的困境。谢谢
SELECT * 
FROM meterstand as a
JOIN (SELECT meter_id, mydate, MAX(source) as source
      FROM meterstand
      GROUP BY meter_id, mydate) as b
ON b.meter_id = a.meter_id
AND b.mydate = a.mydate
AND b.source = a.source
Meter_Reading_Type
========================
Id   Description   Priority
1    Manual        10
2    Calculated    30
3    Read          20