选择唯一ID,同时选择列值

时间:2019-12-19 11:20:50

标签: sql

我有一个看起来像这样的数据库:

ID Date  Result
1   12  good
1   11  bad
2   11  bad
2   10  bad

我想获取一个唯一ID的列表,该列表以最早的日期为好结果,如果结果不存在,则以最早的日期为该ID

这里的结果将是:

ID Date  Result
1   12  good
2   10  bad

我对使用Union感到厌倦,但是我不断得到重复的ID

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

您可以使用discussion_topic_statscoalesce()

group by

编辑:

对于值,您可以使用相同的逻辑:

select id,
       coalesce(min(case when result = 'good' then date end),
                min(date)
               )
from t
group by id;

这假定值是“好”或“坏”。否则,您需要获取列中的第一个值。最好的方法取决于未标记的数据库

答案 1 :(得分:0)

有一个子查询,该查询返回每个ID的最佳结果(如果可用,则为好)。加入该结果:

## To install dependencies:
## sudo pip3 install modbus-tk
##################################################################################################
import serial
import fcntl
import os
import struct
import termios
import array
#import modbus lib
import modbus_tk
import modbus_tk.defines as cst
import modbus_tk.modbus as modbus
#import modbus_tk.modbus_rtu as modbus_rtu
from modbus_tk import modbus_rtu

# RS485 ioctls define
TIOCGRS485 = 0x542E
TIOCSRS485 = 0x542F
SER_RS485_ENABLED = 0b00000001
SER_RS485_RTS_ON_SEND = 0b00000010
SER_RS485_RTS_AFTER_SEND = 0b00000100
SER_RS485_RX_DURING_TX = 0b00010000
# rs 485 port
ser1 = serial.Serial("/dev/ttySC0",19200)    
ser2 = serial.Serial("/dev/ttySC1",9600)

def rs485_enable():
    buf = array.array('i', [0] * 8) # flags, delaytx, delayrx, padding
    #enable 485 chanel 1
    fcntl.ioctl(ser1, TIOCGRS485, buf)
    buf[0] |=  SER_RS485_ENABLED|SER_RS485_RTS_AFTER_SEND
    buf[1]  = 0
    buf[2]  = 0
    fcntl.ioctl(ser1, TIOCSRS485, buf)

    #enable 485 chanel 2
    fcntl.ioctl(ser2, TIOCGRS485, buf)
    buf[0] |=  SER_RS485_ENABLED|SER_RS485_RTS_AFTER_SEND
    buf[1]  = 0
    buf[2]  = 0
    fcntl.ioctl(ser2, TIOCSRS485, buf)
#end of rs485_enable():


if __name__ == '__main__':

    logger = modbus_tk.utils.create_logger("console")

    rs485_enable()

    #set modbus master
    master = modbus_rtu.RtuMaster(
           serial.Serial(port= '/dev/ttySC0',
           baudrate=9600,
           bytesize=8,
           parity='N',
           stopbits=1,
           xonxoff=0)
       )

    master.set_timeout(5.0)
    master.set_verbose(True)
    logger.info("connected")

    read = logger.info(master.execute(1, cst.READ_INPUT_REGISTERS, 5, 1))
    print("Value is: ", read)

答案 2 :(得分:0)

假设表名是temp。

with cte as (select *, row_number()over(partition by id order by result desc, date) date_rn from temp)
    select id, date, result 
    from cte c1 
    where date_rn = 1