Этот вопрос старый, но для всех, кто здесь, как и я, это мое решение, основанное на ответе Джареда:
self.img = QImage('fname.png')
pixmap = QPixmap(QPixmap.fromImage(self.img))
img_label = QLabel()
img_label.setPixmap(pixmap)
img_label.mousePressEvent = self.getPixel
def self.getPixel(self, event):
x = event.pos().x()
y = event.pos().y()
c = self.img.pixel(x,y) # color code (integer): 3235912
# depending on what kind of value you like (arbitary examples)
c_qobj = QColor(c) # color object
c_rgb = QColor(c).getRgb() # 8bit RGBA: (255, 23, 0, 255)
c_rgbf = QColor(c).getRgbf() # RGBA float: (1.0, 0.3123, 0.0, 1.0)
return x, y, c_rgb
Убедитесь, что размер метки соответствует размеру изображения, иначе координаты мыши x и y должны быть преобразованы в координаты изображения. И я думаю, что также возможно использовать метод .pixel()
непосредственно на pixmap, но объект QImage, похоже, работает лучше в моем случае.
Используя Lag
и cte
with cte1 as (
Select *,
lag(changed_date,1,'01-01-1900') over(partition by product_id order by changed_date) as FromDate
from price_history
), cte2 as (
Select product_id, max(FromDate) as changed_date
from cte1
where '2018-01-01' between FromDate and changed_date
group by product_id
)
Select p.*
from price_history p
join cte2 c on p.product_id = c.product_id
where p.changed_date >= c.changed_date;
Решение с union
все еще проще, но не реализовано правильно в других ответах. Итак:
SELECT * FROM price_history
WHERE product_id in (1,2) AND changed_date >= '2018-01-01'
union all
(
select distinct on (product_id)
*
from price_history
where product_id in (1,2) AND changed_date < '2018-01-01'
order by product_id, changed_date desc)
order by product_id, changed_date;
Если у вас была возможность изменить структуру таблицы, другой подход заключался бы в том, чтобы в вашей таблице были как start_date, так и end_date, таким образом ваши записи не будут зависеть от предыдущей / следующей строки, и ваш запрос будет легче писать. См. Медленно меняя размер - Тип 2
Если вы хотите решить проблему с существующей структурой, в PostgresSQL вы можете использовать LIMIT 1
для получения последней записи перед изменением_даты:
SELECT
*
FROM
price_history
WHERE
product_id in (1,2)
AND changed_date >= '2018-01-01'
UNION ALL
-- this would give you the latest price before changed_date
SELECT
*
FROM
price_history
WHERE
product_id in (1,2)
AND changed_date < '2018-01-01'
ORDER BY
changed_date DESC
LIMIT 1
Я думаю, это то, что вы ищете
SELECT Top 1 * FROM price_history WHERE product_id in (1,2) AND changed_date < 2018-01-01
UNION ALL
SELECT * FROM price_history WHERE product_id in (1,2) AND changed_date >= 2018-01-01
Вам нужна первая дата изменения и вся другая дата> «2018-01-01»
select product_id,price, changed_date
from
(
select product_id,price, changed_date,
row_number() over(partition by product_id order by changed_date ) as rn
from price_history
) x
where x.rn = 2 and product_id in (1,2);
union all
select product_id,price, changed_datefrom from price_history
where product_id in (1,2) and changed_date >= '2018-01-01'